2013-08-30 103 views
1

我試圖找到一種方法,水印gif圖片,下面是我的代碼:水印GIF與Python PIL

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:

Watermark Gif

輸出 「out.gif」 我它不再顯示動畫,它顯示了一個帶有水印的幀: Out.gif

我知道PIL支持GIF格式,所以我必須做錯了什麼。所有的幫助表示讚賞。

回答

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() 

而且結果: enter image description here

+0

我找不到任何關於images2gif – Daniel

+0

的文檔@Daniel - 它在源代碼中。 –

1

Images2gif不工作的Python 3.我檢查PIL的文檔,它支持讀取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()