只要我将输入的 GIF 图像转换为 RGBA 进行处理,我就会在图像上享受质量损失。 (你可以看到代码下面的两张图片)
下面显示的代码"工作" 只是我没有线索,为什么我的质量下降。 有什么建议??
from PIL import ImageTk, Image as Im
from Tkinter import *
class App:
def __init__(self):
self.root = Tk()
self.root.geometry('1171x900')
self.maskPng = Im.open("Images/mask.gif")
self.maskPng = self.maskPng.convert("RGBA")
self.mask = ImageTk.PhotoImage(self.maskPng)
self.show = Canvas(self.root, width = 1170, height = 780)
self.show.pack()
self.show.create_image(0, 0, image = self.mask, anchor = NW)
self.speedBTN = Button(self.root, text = "hello", command = self.speed).pack(side = "right")
self.changed = False
def speed(self):
self.speedImg = Im.open("Images/speed/3_1.gif")
self.speedImg = self.speedImg.convert("RGBA")
self.maskPng.paste(self.speedImg, (0,0), self.speedImg)
self.maskPng.save("Images/speed/test.gif", "GIF")
self.render()
def render(self):
self.mask = ImageTk.PhotoImage(Im.open('Images/speed/test.gif'))
self.show.create_image(0,0, image = self.mask, anchor = NW)
self.show.image = self.mask
def draw(self):
self.root.mainloop()
main = App()
main.root.mainloop()
这是我的mask.gif:
这是我的3_1.gif:
(stackoverflow上的白色在gif中是透明的)
这是令人痛苦的,令人痛苦的结果:
(我标记最多"颗粒状"红色矩形区域)
感谢您的帮助! :)
答案 0 :(得分:1)
面对同样的问题,但我可能会为您的用例提供解决方案。
您似乎没有对图像做任何事情,所以为什么不使用base64编码的图像并直接读取它如下所示:
import Tkinter as tk # Python 2
import tkinter as tk # Python 3
# base64 encoded image data
image = ''
root = tk.Tk()
# Pass the base64 encoded data directly to your PhotoImage()
root.image = tk.PhotoImage(data=image)
# Display image in any way you need.
label = tk.Label(root, image=root.image, bg='white')
root.overrideredirect(True)
root.geometry("+250+250")
root.lift()
root.wm_attributes("-topmost", True)
root.wm_attributes("-disabled", True)
root.wm_attributes("-transparentcolor", "white")
label.pack()
label.mainloop()
这个问题已经过时了,所以你不太可能仍然在努力,但我希望它会帮助别人。
这个问题似乎只适用于RGBA,RGB工作得很好,但显然没有Alpha通道。上面的代码将以原始形式呈现图像。
我的问题略有不同,但与此问题有关。我试图操纵像素,所以我必须将其加载为RGBA,处理它并再次保存。
最终修改:
在github上填写问题报告后,我收到了作者的回复。 https://github.com/python-pillow/Pillow/issues/3059
相关部分是:
它的量化问题。 这给出了相同的结果:
(Image.open('./37943912.gif') .convert('RGBA') .quantize() .save('_out.png'))
现在已经过验证,应该被视为最终答案。