【问题标题】:Tkinter screwing with PIL image transparency?Tkinter 搞砸了 PIL 图像透明度?
【发布时间】:2021-12-29 14:46:50
【问题描述】:

我在 python 中制作了一个自定义图像查看程序,因为我找不到一个可以按照我想要的方式工作的程序,而且我知道它至少可以用于处理透明 gif,但现在它不能。效果似乎从 gif 到 gif 到 gif 不同,但它始终是透明度的问题。使用 .save 进行一些测试后,我发现 PIL 图像完全没问题,我可以将其导出为 png,绝对没有问题且透明度完美。话虽如此,尽管制作了该程序,但我从未真正学习过 Tkinter,因为除了简单的画布清除和更新之外,我不需要使用它,所以我不知道如何在 PIL 之外进行测试。我认为问题应该在这些方面:

image = ImageTk.PhotoImage(GifFrameSized) #GifFrameSized is the resized GIF
imagesprite = canvas.create_image(show.w/2,show.h/2,image=image) #w and h are the width and height of the monitor
root.update_idletasks()
root.update()
canvas.pack()

我真的不知道问题是如何来自这些问题,但我能够使用 PIL 将框架的 png 保存在“image = ImageTk.PhotoImage(GifFrameSized)”上方的行中,它看起来很好,所以我必须想象它在那些行中的某个地方。

【问题讨论】:

  • 您提到了一个您从未向我们解释过的问题,也没有给出重现它的代码,也没有在您的问题中显示示例。这个问题在这个状态下如何解决?请查看您的问题并添加解决问题所需的信息。
  • 我真的无法解释它,因为正如我所说,它因 gif 不同而不同,具体取决于它们的编码方式。我给出了导致问题的代码段,并且我测试过的每个透明的 sinlge gif 都有问题。
  • 看看我的魔法玻璃球告诉我你用新的图片覆盖了你的图片并且不更新图片。另见When should I use root.update() in tkInter for python
  • 那么似乎是gif的问题,仅仅因为您可以将其导出为png并不意味着它是透明的或上面的问题
  • 尝试使用GifFrameSized = GifFrameSized.convert("RGBA")将GIF图像的模式转换为“RGBA”。

标签: python tkinter python-imaging-library


【解决方案1】:

所以我使用了这个gif file,它按预期工作。实现它似乎没有什么魔力。我只是得到一个对动画图像的每一帧的图像引用,并用它制作一个itertools.cycle:

frames = []
im = Image.open('52O8.gif')
for frame in range(im.n_frames):
    im.seek(frame)
    frames.append(ImageTk.PhotoImage(im.copy()))
frames_cycle=cycle(frames)

然后我只是在循环中每 100 毫秒迭代一次,以在我的画布中显示不同的帧:

DELAY = 100

def animate():
    canvas.itemconfig(img,image=next(frames_cycle))
    root.after(DELAY,animate)

完整代码

import tkinter as tk
from PIL import Image, ImageTk
from itertools import cycle

DELAY = 100

def animate():
    canvas.itemconfig(img,image=next(frames_cycle))
    root.after(DELAY,animate)

root = tk.Tk()
root.config(background='black')

frames = []
im = Image.open('52O8.gif')
for frame in range(im.n_frames):
    im.seek(frame)
    frames.append(ImageTk.PhotoImage(im.copy()))
frames_cycle=cycle(frames)

canvas = tk.Canvas(root,bg='black',width=400,height=400)
img = canvas.create_image(0,0,anchor=tk.NW,image=next(frames_cycle))
canvas.pack()
animate()
root.mainloop()

【讨论】:

  • @Church.exe tkinter 作为一个工具包可以满足您的所有需求,您只需为其编写代码。我从来没有被强迫过另一个。
  • 事实证明,99% 的问题实际上是 Pillow 中的错误。我只是再次运行它,对这个问题感到恼火,但是这次当我搜索它时,我能够找到一些关于今年 1 月 2 日修复的枕头错误的模糊参考,当我现在更新它几乎完全修复时。关于我认为是任何给定 gif 的第一帧的问题,我仍然有一些简短的问题,但如果这是 PIL 的问题,我也只需要等待修复即可。 (除了我每天都会“只好 99%”)(P.S. 抱歉花了这么长时间,个人原因,我不能满足字符限制)
  • @Church.exe 虽然我无法重现该问题并且我发布的代码对我来说效果很好,但我无法在这里为您提供帮助。你可以设置一个赏金。
猜你喜欢
  • 2019-05-04
  • 2021-04-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多