使用PIL.convert(“RGBA”)时质量下降

时间:2015-03-01 22:57:06

标签: python image-processing python-imaging-library

我的问题:

只要我将输入的 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: What it should look like


这是我的3_1.gif:

(stackoverflow上的白色在gif中是透明的) enter image description here


这是令人痛苦的,令人痛苦的结果:

(我标记最多"颗粒状"红色矩形区域) enter image description here

感谢您的帮助! :)

1 个答案:

答案 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'))

现在已经过验证,应该被视为最终答案。