Рамки не исчезают в палочке питона - PullRequest
0 голосов
/ 17 мая 2018

В соответствии с подсказкой здесь я попытался создать gif с двумя разными изображениями, как показано ниже. Это работает, но один кадр не исчезает, чтобы показать другой кадр. Почему это случилось и как исправить?

from wand.image import Image as Image2

with Image2() as wand:
    # Add new frames into sequance
    with Image2(blob=d2) as one:
        wand.sequence.append(one)
    with Image2(blob=d3) as two:
        wand.sequence.append(two)

    # Create progressive delay for each frame
    for cursor in range(2):
        with wand.sequence[cursor] as frame:
            frame.delay = 100
    # Set layer type
    wand.type = 'optimize'
    wand.save(filename='animated.gif')

display(Image('animated.gif'))

Токовый выход:
img

1 Ответ

0 голосов
/ 17 мая 2018

Обновленный ответ

... Я получил ошибку при использовании этого ...

Похоже, что жестко закодированные значения проверки не позволяют использовать этот метод. Это ошибка, и я отправлю патч для апстрима.

@ -2548,7 +2548,7 @@ class BaseImage(Resource):
         .. versionadded:: 0.4.3

         """
-        if method not in ['merge', 'flatten', 'mosaic']:
+        if method not in IMAGE_LAYER_METHOD:
             raise TypeError('method must be one of: merge, flatten, mosaic')

В настоящее время не реализует методы C-API MagickSetImageDispose или MagickExtentImage, что, как я полагаю, вам нужно. Хотя эти методы довольно легко реализовать, вы можете столкнуться с перестройкой каждого изображения - кадр за кадром.

from wand.image import Image as Image2
from wand.color import Color
from wand.compat import nested

with nested(Image2(),
            Image2(filename='d2.gif'),
            Image2(filename='d3.gif')) as (wand, one, two):
    width = max(one.width, two.width)
    height = max(one.height, two.height)
    # Rebuild images with full extent of frame
    with Image2(width=width, height=height, background=Color('WHITE')) as f1:
        f1.composite(one, 0, 0)
        wand.sequence.append(f1)
    with Image2(width=width, height=height, background=Color('WHITE')) as f2:
        f2.composite(two, 0, 0)
        wand.sequence.append(f2)
    # Create progressive delay for each frame
    for cursor in range(2):
        with wand.sequence[cursor] as frame:
            frame.delay = 100
    wand.type = 'optimize'
    wand.save(filename='animated.gif')

Оригинальный ответ НЕ ИСПОЛЬЗОВАТЬ!


Вы хотите вызвать wand.image.Image.merge_layers метод, а не wand.image.Image.type свойство.

Попробуйте следующее ...

with Image2() as wand:
    # Add new frames into sequance
    with Image2(blob=d2) as one:
        wand.sequence.append(one)
    with Image2(blob=d3) as two:
        wand.sequence.append(two)

    # Create progressive delay for each frame
    for cursor in range(2):
        with wand.sequence[cursor] as frame:
            frame.delay = 100
    # Set layer type
    wand.merge_layers('optimize')  # or 'optimizeimage', or 'composite'
    wand.save(filename='animated.gif')
...