Я использую следующий код, чтобы добавить водяной знак к анимированным изображениям GIF. Моя проблема в том, что все кадры GIF, кроме первого, имеют неправильные цвета. Вы знаете, как исправить цвет рамок? Спасибо.
def add_watermark(in_file, watermark_file, watermark_position, watermark_ratio, out_file, quality=85):
img = Image.open(in_file)
watermark_layer = Image.new('RGBA', img.size, (0,0,0,0))
watermark_img = Image.open(watermark_file).convert('RGBA')
watermark_img.thumbnail((img.size[0]/watermark_ratio, 1000), Image.ANTIALIAS)
alpha = watermark_img.split()[3]
alpha = ImageEnhance.Brightness(alpha).enhance(0.95)
watermark_img.putalpha(alpha)
watermark_layer.paste(watermark_img, count_watermark_position(img, watermark_img, watermark_position))
frames = images2gif.readGifFromPIL(img, False)
frames_out = []
for frame in frames:
frames_out.append(Image.composite(watermark_layer, frame, watermark_layer))
images2gif.writeGif(out_file, frames_out, duration=0.5)
Чтобы завершить пример, я также предоставляю код вспомогательной функции:
def count_watermark_position(img, watermark, position):
if position == 'right_bottom':
return img.size[0] - watermark.size[0], img.size[1] - watermark.size[1]
if position == 'center':
return (img.size[0] - watermark.size[0])/2, (img.size[1] - watermark.size[1])/2
if position == 'left_bottom':
return 0, img.size[1] - watermark.size[1]
if position == 'left_top':
return 0, 0
if position == 'right_top':
return img.size[0] - watermark.size[0], 0
raise AttributeError('Invalid position')
Исходный код images2gif, который я использовал - я немного изменил его, чтобы он работал с подушкой. См. комментарий в начале исходного кода.
count_watermark_position()
? - person adrianus   schedule 21.07.2015images2gif
, но есть ли разница, если вы конвертируете составные изображения в режим «RGB» или «P»? - person PM 2Ring   schedule 21.07.2015images2gif.readGifFromPIL()
или какую версиюimages2gif
вы используете? Я скачал последнюю версию images2gif, но там нет такого метода. Я получаю его для работы сreadGif()
хотя... - person adrianus   schedule 21.07.2015img = Image.open(in_file)
наimg = Image.open(in_file).convert("RGB")
, похоже, что информация о кадрах будет потеряна, и результатом будет GIF только с первым кадром (не анимированным). То же самое происходит и с режимом «P». Похоже, я не могу преобразовать изображение перед использованием images2gif. - person snakey   schedule 21.07.2015images2gif.writeGif
. Напримерframes_out.append(Image.composite(watermark_layer, frame, watermark_layer).convert(mode='RGB'))
- person PM 2Ring   schedule 21.07.2015images2gif
? - person adrianus   schedule 21.07.2015