我尝试使用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。