为何保存的Turtle绘图背景非设置黑色?如何修复代码
解决Turtle绘图保存后背景不是黑色的问题
问题原因
Turtle通过getcanvas().postscript()生成的EPS矢量文件默认不包含画布背景色,背景为透明状态。当用PIL将EPS格式转为JPG时,透明区域会被自动填充为白色,这就是保存后的图像背景不是黑色的核心原因。
修复方案
以下两种方法均可解决问题,任选其一即可:
方法1:生成EPS时直接指定黑色背景
修改postscript()方法的调用参数,添加colormode='color'和bg='black',让生成的EPS文件自带黑色背景:
from PIL import Image, EpsImagePlugin import os import turtle EpsImagePlugin.gs_windows_binary=r'C:\Program Files\gs\gs10.01.2\bin\gswin64c' # 绘制图形 point = turtle.Turtle() point.speed(0) point.color('yellow') point.penup() point.sety(-6*25) point.pendown() point.begin_fill() point.circle(6*25, steps=6) point.end_fill() point.hideturtle() # 设置画布背景并生成带背景的EPS screen = turtle.Screen() screen.bgcolor('black') board = screen.getcanvas() # 添加colormode和bg参数,指定黑色背景 board.postscript(file="test_drawing.eps", colormode='color', bg='black') # 转换为JPG并查看 Image.open("test_drawing.eps").save("test_drawing.jpg", "JPEG") Image.open(r'C:\Users\parth\Desktop\coding\test_drawing.jpg').show() # 旋转并保持黑色背景 Image.open(r'C:\Users\parth\Desktop\coding\test_drawing.jpg').rotate(45, fillcolor='black', expand=True).show() os.remove(path=r'C:\Users\parth\Desktop\coding\test_drawing.jpg')
方法2:用PIL给JPG图像添加黑色背景
如果需要保留原始EPS的透明属性,可在转JPG后手动创建黑色背景画布,将绘制的图像粘贴上去:
from PIL import Image, EpsImagePlugin import os import turtle EpsImagePlugin.gs_windows_binary=r'C:\Program Files\gs\gs10.01.2\bin\gswin64c' # 绘制图形部分不变 point = turtle.Turtle() point.speed(0) point.color('yellow') point.penup() point.sety(-6*25) point.pendown() point.begin_fill() point.circle(6*25, steps=6) point.end_fill() point.hideturtle() screen = turtle.Screen() screen.bgcolor('black') board = screen.getcanvas() board.postscript(file="test_drawing.eps") # 转换时添加黑色背景 eps_img = Image.open("test_drawing.eps") # 创建与原图尺寸相同的黑色背景画布 bg_img = Image.new("RGB", eps_img.size, (0, 0, 0)) # 将EPS图像粘贴到黑色背景上(利用alpha通道处理透明区域) bg_img.paste(eps_img, mask=eps_img.split()[3]) bg_img.save("test_drawing.jpg", "JPEG") Image.open(r'C:\Users\parth\Desktop\coding\test_drawing.jpg').show() Image.open(r'C:\Users\parth\Desktop\coding\test_drawing.jpg').rotate(45, fillcolor='black', expand=True).show() os.remove(path=r'C:\Users\parth\Desktop\coding\test_drawing.jpg')
说明
- 方法1更直接,生成的EPS本身包含背景色,后续转换无需额外处理;
- 方法2适合需要保留原始EPS透明背景,仅在转JPG阶段添加背景的场景。
内容的提问来源于stack exchange,提问作者Parth Ratra
相关产品推荐
相关产品推荐

