可能重复:
Python:将 GIF 帧转换为 PNG
我尝试使用 PIL 加载 GIF 动画的帧,但得到了有趣的结果。第一帧加载正常,但其余所有帧都包含错误数据。在我的原始图像上,它们看起来“变灰”,而在我在这里使用的测试图像中,它们看起来只是黑色。我猜这是由调色板索引直接用作每个组件的颜色值引起的。
我似乎得到了第一帧的正确数据,而其他帧的数据不正确。IE。如果我在不看第一帧的情况下寻找第二帧,我会得到该帧的正确数据。通过使用它,我可以通过在每一帧之间重新打开图像并在新打开的图像中寻找下一帧来解决这个问题。
这似乎只发生在我使用im.convert()
, 即。当远离 GIF 的索引颜色模型时。即使在使用时也会触发它im.copy()
,因此即使我只是在第一帧上使用它,第二帧在使用im.convert()
.
这是 PIL 中的一个错误,还是我只是在做一些可怕的、可怕的错误?我的解决方法是一个非常丑陋的黑客,有没有更好的方法来解决这个问题?
这是一个说明问题的片段:(它将测试图像写入rgb.gif
当前工作目录)
import binascii
import Image
# Create the test image file
path = 'rgb.gif'
with file(path, 'wb') as f:
f.write(binascii.a2b_base64('R0lGODlhCAAIAKEDAAAA//8AAAD/AP///yH'
'/C05FVFNDQVBFMi4wAwEAAAAh+QQJZAADACwAAAAACAAIAAACC5yPiRHJvJ'
'5rqqYCACH5BAlkAAMALAAAAAAIAAgAAAILnI+JIsm8nmuqpgIAIfkECWQAA'
'wAsAAAAAAgACAAAAgucj4kAybyea6qmAgA7'
))
# Look at frame 0, then load frame 1
im = Image.open(path)
test1_frame0 = im.copy()
im.seek(1)
# im.convert() returns a new image but I'm using im.copy() to
# make it clear this shouldn't affect the original image
test1_frame1 = im.copy().convert('RGBA').tostring()
# Load frame 1 without looking at frame 0 first
im = Image.open(path)
im.seek(1)
test2_frame1 = im.copy().convert('RGBA').tostring()
# Result is not equal, ie. just doing im.copy() on the first frame
# alters the second frame
print test1_frame1 == test2_frame1
我正在使用 PIL 1.1.7。