4

フラクセルの答えを使おうとすると

http://stackoverflow.com/questions/10269099/pil-convert-gif-frames-to-jpg

画像上http://24.media.tumblr.com/fffcc2d8e980fbba4f87d51ed4916b87/tumblr_mh8uaqMo2I1rkp3avo2_250.gif

一部のデータは正常に取得されますが、一部のデータは次のように欠落しています。

正しい

正しい_1 正しい_2

ない

行方不明_1 ここに画像の説明を入力

これらを表示するには、imagemagick をdisplay foo* 使用し、スペースを使用して画像を移動します ... imagemagick がそれらを間違って読み取っている可能性はありますか?

編集:

convert を使用してから表示する場合でもdisplay foo* 、次のようになります

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

これはgifの特徴でしょうか?

4

2 に答える 2

3

ImageMagick に固執できる場合、これを解決するのは非常に簡単です。

convert input.gif -coalesce output.png

それ以外の場合は、各 GIF フレームを構成するさまざまな形式を検討する必要があります。この特定のタイプのGIF、および他の質問に示されている他のものについては、次のコードが機能します(以前の質問では、受け入れられた回答が実際にすべての分割部分を透明にするわけではないことに注意してください-少なくとも最新のものではリリースされた PIL):

import sys
from PIL import Image, ImageSequence

img = Image.open(sys.argv[1])

pal = img.getpalette()
prev = img.convert('RGBA')
prev_dispose = True
for i, frame in enumerate(ImageSequence.Iterator(img)):
    dispose = frame.dispose

    if frame.tile:
        x0, y0, x1, y1 = frame.tile[0][1]
        if not frame.palette.dirty:
            frame.putpalette(pal)
        frame = frame.crop((x0, y0, x1, y1))
        bbox = (x0, y0, x1, y1)
    else:
        bbox = None

    if dispose is None:
        prev.paste(frame, bbox, frame.convert('RGBA'))
        prev.save('foo%02d.png' % i)
        prev_dispose = False
    else:
        if prev_dispose:
            prev = Image.new('RGBA', img.size, (0, 0, 0, 0))
        out = prev.copy()
        out.paste(frame, bbox, frame.convert('RGBA'))
        out.save('foo%02d.png' % i)

-coalesce上記のコードは特定の GIF 画像では機能しない可能性があるため、最終的には、何を行うかを再作成する必要があります。

于 2013-01-27T18:49:38.890 に答える
-1

次の代わりに、フレームの全履歴を「バックグラウンド」に保持するようにしてください。

background = Image.new("RGB", size, (255,255,255))
background.paste( lastframe )
background.paste( im2 )

ループの前に一度「背景」を作成し、その上に paste() フレームのみを作成すると、機能するはずです。

于 2013-01-27T17:54:54.847 に答える