Python Pygame|实现GIF(gif)动图的加载和降帧【源码+解析】_pygame gif

一、准备一份透明背景的GIF动画素材

二、使用pillow库对GIF动图进行解帧

三、使用pygame.image.load()读取所有解出来的帧并存入列表

四、在精灵类的update()方法中循环播放列表中的帧

五、避免精灵帧率过快对精灵进行降帧

六、实例完整源代码


一、准备一份透明背景的GIF动画素材

首先在网络上找一张背景透明的GIF动图,注意需要背景透明的,不然在游戏中就会显示一个矩形图片,会挡住游戏的背景。以下就是百度图片搜索找到的背景透明的GIF动图。

百度图片搜索的素材

二、使用pillow库对GIF动图进行解帧

使用pillow库的Image、ImageSequence包对图片进行解帧后发现,这张下载的GIF图片包含了10帧图片,图片以png格式保存在**./images/bird/**文件夹下面,文件名以gif1、gif2…等为后缀名。

GIF解帧后的文件情况

参考代码:

from PIL import Image, ImageSequence

class GameGifSprite(pygame.sprite.Sprite):
    """
    小鸟游戏精灵
    """
    def __init__(self, image_name, speed=1):
        # 调用父类的初始化方法
        super().__init__()
        # 使用pillow的image打开GIF动图
        pillow_image = Image.open(image_name)
        index = 1
        # 使用pillow的ImageSequence获取GIF动图所有帧对应的迭代器
        for frame in ImageSequence.all_frames(pillow_image):
            # 以png格式保存在./images/bird/文件夹下面,文件名以gif1、gif2......等为后缀名
            frame.save(f"./images/bird/gif{index}.png", quality=100)
            index = index + 1
三、使用pygame.image.load()读取所有解出来的帧并存入列表

然后使用**pygame.image.load()**按文件名字顺序读取这10张图片,并把返回的10个图像对象添加到列表中。

1)all_frame为GIF动图所包含的所有帧数,这里index循环结束后为11,由于数组从0开始计算,所以为11-2=9。
2)now_frame为当前游戏的帧,一开始设置为0。
3)gif_images为存储GIF动图的帧列表。
4)循环读取所有帧,添加到**gif_images[]**中。
5)游戏开始时设置显示第一帧图片。

参考代码:

# 定义对象的属性
# 1.all_frame为GIF动图所包含的所有帧数,这里index循环结束后为11,由于数组从0开始计算,所以为11-2=9
self.all_frame = index - 2
# 2.now_frame为当前游戏的帧,一开始设置为0
self.now_frame = 0
# 3.gif_images为存储GIF动图的帧列表
self.gif_images = []
# 4.循环读取所有帧,添加到gif_images[]中
for i in range(1, index):
    self.gif_images.append(pygame.image.load(f"./images/bird/gif{i}.png"))
# 5.游戏开始时设置显示第一帧图片
self.image = self.gif_images[self.now_frame]
四、在精灵类的update()方法中循环播放列表中的帧

pygame在每次画面刷新时会调用每个精灵类的**update()**方法,所以我们只要在该方法下实现循环播放这10帧图片就可以实现含有GIF图片精灵的播放。以下是游戏运行效果图:

游戏运行效果图

1)当播放到gif最后一帧时,重置为gif第一帧
2)画面每次刷新更新gif的下一帧

参考代码:



### 最后

> **🍅 硬核资料**:关注即可领取PPT模板、简历模板、行业经典书籍PDF。  
> **🍅 技术互助**:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。  
> **🍅 面试题库**:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。  
> **🍅 知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值