【问题标题】:Quality loss while using PIL.convert("RGBA")使用 PIL.convert("RGBA") 时的质量损失
【发布时间】:2018-03-31 20:30:21
【问题描述】:

我的问题:

只要我将输入的 GIF 图像转换为 RGBA 进行处理,我就会享受图像的质量损失。 (您可以在代码下方看到两张图片)

下面显示的代码“works”只是我不知道,为什么我会失去质量。 有什么建议吗??

我的代码:

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()

图片:

这是我的面具.gif:


这是我的 3_1.gif:

(stackoverflow 上的白色在 gif 中是透明的)


这是颗粒状、令人痛心的结果:

(我用红色矩形标记了最“颗粒状”的区域)

感谢您的帮助! :)

【问题讨论】:

  • 我猜这个问题与颜色的数量有关。 GIF 可以使用索引颜色。在您的图像中,有很多微妙不同的灰色阴影,而颜色的阴影并不多,所以这是一个很好的匹配。然而,RGBA 将其支持的颜色均匀分布在整个色彩空间中。您可能会看到是否有可用的替代配色方案在您需要的区域中具有更高的保真度(或者总体上更保真!)。我对PIL的图像处理一无所知,所以无法提出具体的解决方案。
  • 您再次将图像另存为 GIF,这将重新计算调色板。出现伪像是因为修改稍微改变了颜色权重(或者 PIL 的颜色下采样算法可能不同,以至于总是以这种方式改变它)。尝试另存为 24 位彩色图像 - 问题会消失吗?我不知道 PIL 是否允许在不触摸调色板的情况下修改索引图像。

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


【解决方案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'))

这已得到验证,应被视为最终答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多