2

重複の可能性:
Python:GIFフレームをPNGに変換

PILを使用してGIFアニメーションのフレームを読み込もうとしましたが、面白い結果が得られました。最初のフレームは正常に読み込まれましたが、残りはすべて間違ったデータが含まれていました。元の画像では「グレー表示」に見えましたが、ここで使用するテスト画像では黒く見えます。パレットのインデックスが各コンポーネントの色の値として直接使用されていることが原因だと思います。

最初に見たフレームでは正しいデータを取得し、他のフレームでは誤ったデータを取得しているようです。つまり。最初のフレームを見ずに2番目のフレームを探すと、代わりにそのフレームの正しいデータを取得します。それを使用することで、各フレーム間で画像を再度開き、代わりに新しく開いた画像の次のフレームを探すことで問題を回避できます。

これは、私が使用している場合にのみ発生するようですim.convert()。GIFのインデックスカラーモデルから離れるとき。ただし、使用しているときでもトリガーされるim.copy()ので、最初のフレームで使用したとしても、2番目のフレームでは使用後に間違ったデータが表示され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

PIL1.1.7を使用しています。

4

1 に答える 1

1

これを投稿した直後にサイドバーでこれに気づいたので、どうやらバグです。

于 2012-10-12T02:57:29.847 に答える