绘图程序背景颜色修改操作过慢,如何实现快速修改?
绘图程序背景颜色修改操作过慢,如何实现快速修改?
嘿,我懂你的烦恼!现在你改背景色时用两层循环挨个像素检查替换,600×600的画布有36万个像素呢,Python的循环本身就慢,这么折腾肯定会卡得不行。咱们换个思路,用PIL自带的底层批量处理功能,分分钟解决速度问题!
问题出在哪?
你当前的bgcolor方法里,嵌套for循环遍历每个像素,先getpixel取颜色、判断是不是白色,再putpixel修改。这种逐像素的Python操作效率极低,完全没用到PIL已经优化好的底层C实现能力。
优化后的代码方案
我们可以用PIL的掩码(mask)+图像粘贴功能,批量替换白色背景,所有操作都是底层加速的,速度快到飞起:
def bgcolor(self): chosen_color = askcolor(color=self.canvas["bg"])[1] self.canvas.configure(bg=chosen_color) color_RGB = ImageColor.getcolor(chosen_color, "RGB") # 1. 生成掩码:标记出原图像里的白色区域 # 先转灰度图,方便判断白色(灰度值255就是纯白) gray_img = self.my_image.convert('L') # 创建掩码:白色区域设为255(不透明),其他区域设为0(透明) mask = gray_img.point(lambda x: 255 if x == 255 else 0, mode='1') # 2. 创建填充好目标颜色的新背景图 new_bg = im.new("RGB", self.my_image.size, color_RGB) # 3. 把原图像的非白色部分粘贴到新背景上(掩码控制只保留非白色内容) new_bg.paste(self.my_image, mask=mask) # 4. 更新我们的绘图图像 self.my_image = new_bg
额外小提醒:修正类变量的隐患
你现在代码里的my_image和draw是类变量,如果后续创建多个P实例,它们会共享同一个图像,很容易出bug。建议把这些变量移到__init__方法里,改成实例变量:
class P: def __init__(self,window): self.window = window self.x = self.y = None self.image = None # 把图像和绘图对象改成实例专属的变量 self.my_image = im.new("RGB",(600,600),(255,255,255)) self.draw = ImageDraw.Draw(self.my_image) # 剩下的框架、画布创建代码保持不变 self.upper_frame = Frame(window) self.upper_frame.grid(row=0,column=0, padx=10, pady=5,sticky="ew") # ... 其余代码省略
这样修改后,背景色替换操作几乎是瞬间完成的,再也不会有卡顿啦!
备注:内容来源于stack exchange,提问作者Hale
相关产品推荐
相关产品推荐

