Как сохранить анимированный GIF в переменную с помощью подушки - PullRequest
0 голосов
/ 25 июня 2018

Я узнал из здесь , что я могу создавать и сохранять анимированные GIF-файлы, используя подушку.Однако это не похоже на метод save , возвращающий любое значение.

Я могу сохранить GIF в файл и затем открыть этот файл, используя Image.open, но это кажетсяне нужно, учитывая, что я не хочу, чтобы GIF-файл был сохранен.

Как сохранить GIF-файл в переменной, а не в файле?То есть я хотел бы иметь возможность some_variable.show() и отображать GIF без необходимости сохранять GIF на моем компьютере.

1 Ответ

0 голосов
/ 28 июня 2018

Чтобы избежать записи каких-либо файлов, вы можете просто сохранить свое изображение в BytesIO объекте.Например:

from PIL import Image
from PIL import ImageDraw
from io import BytesIO

N = 25          # number of frames

# Create individual frames
frames = []
for n in range(N):
    frame = Image.new("RGB", (200, 150), (25, 25, 255*(N-n)/N))
    draw = ImageDraw.Draw(frame)
    x, y = frame.size[0]*n/N, frame.size[1]*n/N
    draw.ellipse((x, y, x+40, y+40), 'yellow')
    # Saving/opening is needed for better compression and quality
    fobj = BytesIO()
    frame.save(fobj, 'GIF')
    frame = Image.open(fobj)
    frames.append(frame)

# Save the frames as animated GIF to BytesIO
animated_gif = BytesIO()
frames[0].save(animated_gif,
               format='GIF',
               save_all=True,
               append_images=frames[1:],      # Pillow >= 3.4.0
               delay=0.1,
               loop=0)
animated_gif.seek(0,2)
print ('GIF image size = ', animated_gif.tell())

# Optional: display image
#animated_gif.seek(0)
#ani = Image.open(animated_gif)
#ani.show()

# Optional: write contents to file
#animated_gif.seek(0)
#open('animated.gif', 'wb').write(animated_gif.read())

В конце переменная animated_gif содержит содержимое следующего изображения:

Sunset

Однако,отображение анимированного GIF в Python не очень надежно.ani.show() из кода выше показывает только первый кадр на моей машине.

...