1

私はgif画像に透かしを入れる方法を見つけようとしています.以下は私のコードです:

img = Image.open("my.gif")
watermark = Image.open("watermark.gif")

img.paste(watermark, (1, 1))
img.save("out.gif")

ファイル: my.gif:

my.gif

ファイル: watermark.gif:

透かしGIF

出力「out.gif」はアニメーション化されなくなり、透かしのある 1 つのフレームが表示されます。 Out.gif

PIL が GIF 形式をサポートしていることはわかっているので、何か間違ったことをしているに違いありません。すべての助けに感謝します。

4

2 に答える 2

4

アニメーション GIF は、実際には一連の画像であり、それらを切り替えるためのルールと時間があるため、すべてを変更してすべてを出力する必要があります -これにはimages2gifを使用できます - または、自分で多くの作業を行うことができます。

上記のリンクからダウンロードした後の images2gif の使用例:

from PIL import Image
import images2gif as i2g
images = i2g.readGif('Animated.gif', False)
watermark = Image.open("Watermark.gif")
for i in images: i.paste(watermark, (1, 1))

i2g.writeGif('Out.gif', images, 0.5) # You may wish to play with the timing, etc.
exit()

そして結果: ここに画像の説明を入力

于 2013-08-30T10:46:49.603 に答える
2

Images2gif が Python 3 で動作しません。PIL doc を確認しました。GIF 画像の読み取りをサポートしていますが、保存すると画像がアニメーション化されません。アプリのユーザーがアップロードした画像に透かしを入れる必要があります。コードは次のように既に実行しています。GIF画像なしで機能しました。

def watermark(fp, text, position=None, font=None, quality=85):
    if isinstance(fp, bytes):
        fp = BytesIO(fp)
    im = Image.open(fp)

    water_im = Image.new("RGBA", im.size)
    water_draw = ImageDraw.ImageDraw(water_im)
    if isinstance(font, str):
        font = ImageFont.truetype(font, 10 + int(im.size[0] / 100))
    if not position:
        water_size = water_draw.textsize(text, font=font)
        position = (im.size[0] - water_size[0] * 1.05,
                    im.size[1] - water_size[1] * 1.2)
    water_draw.text(position, text, font=font)
    water_mask = water_im.convert("L").point(lambda x: min(x, 160))
    water_im.putalpha(water_mask)

    if im.format == 'GIF':
        for frame in ImageSequence.Iterator(im):
            frame.paste(water_im, None, water_im)
    else:
        im.paste(water_im, None, water_im)
    out = BytesIO()
    im.save(out, im.format, quality=quality, **im.info)

    return out.getvalue()
于 2014-12-26T07:50:28.777 に答える