Python Pillow - 创建动画 GIF



GIF(图形交换格式)是一种位图图像格式,由 CompuServe(一家在线服务提供商)的一个团队在美籍计算机科学家史蒂夫·威尔海特(Steve Wilhite)的领导下开发。GIF 最初并非设计为动画媒介。然而,它能够在一个文件中存储多张图像,这使得它成为表示动画序列帧的合乎逻辑的选择。为了支持动画的呈现,GIF89a 规范引入了图形控制扩展(GCE)。此扩展允许指定每个帧的时间延迟,从而有效地允许从一系列图像创建视频剪辑。

在动画 GIF 中,每个帧都由其自己的 GCE 引入,指定在绘制帧后应发生的时间延迟。此外,在文件开头定义的全局信息用作所有帧的默认设置,简化了动画设置和行为的管理。

Python 的 Pillow 库可以读取 GIF87a 和 GIF89a 格式的 GIF 文件。默认情况下,它以 GIF87a 格式写入 GIF 文件,除非使用了 GIF89a 功能或输入文件已经是 GIF89a 格式。保存的文件使用 LZW 编码。

使用 Python Pillow 创建动画 GIF

可以使用 Pillow 的 Image.save() 函数创建动画 GIF。以下是调用 save() 函数以保存 GIF 文件时的语法和可用选项:

语法

Image.save(out, save_all=True, append_images=[im1, im2, ...])

选项

  • save_all - 如果设置为 true,则保存图像的所有帧。否则,仅保存多帧图像的第一帧。

  • append_images - 此选项允许将图像列表附加为附加帧。列表中的图像可以是单帧或多帧图像。此功能支持 GIF、PDF、PNG、TIFF 和 WebP 格式,以及 ICO 和 ICNS 格式。当提供相关大小的图像时,它们将用于代替缩小主图像。

  • include_color_table - 确定是否包含本地颜色表。

  • interlace - 指定图像是否交错。默认情况下,启用交错,除非图像的宽度或高度小于 16 像素。

  • disposal - 指示在显示图形后如何处理图形。可以将其设置为 0(未指定处理)、1(不处理)、2(恢复为背景颜色)或 3(恢复为先前内容)等值。您可以为常量处理传递单个整数,或传递列表/元组以分别为每个帧设置处理。

  • palette - 此选项允许您为保存的图像使用指定的调色板。调色板应作为包含 RGBRGB... 格式的调色板条目的字节或字节数组对象提供。它不应超过 768 个字节。或者,您可以将调色板作为 PIL.ImagePalette.ImagePalette 对象传递。

  • optimize - 如果设置为 true,则尝试通过消除未使用的颜色来压缩调色板。当调色板可以压缩到下一个较小的 2 的幂元素时,此优化很有用。

  • 可以提供诸如透明度、持续时间、循环和注释之类的其他选项来控制动画 GIF 的特定方面。

示例

这是一个示例,演示了如何通过生成具有不同颜色的单个帧并保存它们来创建 GIF 动画。

import numpy as np
from PIL import Image

# Function to create a new image with a specified width, height, and color
def create_image(width, height, color):
   return Image.new("RGBA", (width, height), color)

# Set the width and height of the images
width, height = 300, 300

# Define the colors for the images
colors = [(64, 64, 3), (255, 0, 0), (255, 255, 0), (255, 255, 255), (164, 0, 3)]

# Create a list of images using a list comprehension
images = [create_image(width, height, color) for color in colors]

# Save the images as a GIF with specified parameters
images[0].save("Output.gif", save_all=True, append_images=images[1:], duration=1000/2, loop=0)

输出

The animated GIFs file is saved successfully...

您可以在工作目录中看到保存的动画 GIF:

color

示例

以下示例获取现有图像文件的列表,通过按顺序保存这些图像来创建动画 GIF。

from PIL import Image

# List of file paths for existing images
image_paths = ['Images/book_1.jpg', 'Images/book_2.jpg', 'Images/book_3.jpg', 'Images/book_4.jpg']

# Create a list of image objects from the provided file paths
image_list = [Image.open(path) for path in image_paths]

# Save the first image as an animated GIF
output_path = \Book_Animation.gif'

image_list[0].save(
   output_path,
   save_all=True,
   append_images=image_list[1:],  # Append the remaining images
   duration=1000,  # Frame duration in milliseconds
   loop=0
)

print('The animated GIF file has been created and saved successfully...')

输出

The animated GIF file has been created and saved successfully...

下图显示了保存在工作目录中的动画 GIF:

book animation

示例

此示例通过将现有 GIF 文件的最后一帧复制几次,然后将其另存为新的 GIF 文件来修改现有 GIF 文件。在此示例中,我们将使用 ImageSequence 模块来迭代输入 GIF 文件中的每个帧。

from PIL import Image, ImageSequence

# Open the existing GIF file 
input_image = Image.open("Book_Animation.gif")

# Create an empty list to store the frames of the GIF
frames = []

# Iterate over the frames of the GIF and append them to the frames list
for frame in ImageSequence.Iterator(input_image):
   frames.append(frame)

# Duplicate the last frame three times to extend the animation
for i in range(3):
   frames.append(frames[-1])

# Save the frames as a new GIF file ("newGif.gif"):
output_path = "newGif.gif"
frames[0].save(
   output_path,
   save_all=True,
   append_images=frames[1:],
   optimize=False,
   duration=40,  # Set the frame duration to 40 milliseconds
   loop=0
)

输出

下图显示了保存在工作目录中的动画 GIF:

book animation
广告