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

这篇具有很好参考价值的文章主要介绍了Python Pygame|实现GIF(gif)动图的加载和降帧【源码+解析】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        最近在使用pygame开发游戏,练习python编程。但遇到了一个问题,就是如何载入已有的GIF动图增强游戏的效果,在csdn搜索了一下,发现相关的文章比较少,缺少实例。于是自己研究了相关内容,找到了解决方案。本篇文章用游戏编程实例介绍pygame如何载入GIF动图。

pygame gif,Pygame,pygame,python,游戏,游戏程序,GIF


目录

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

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

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

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

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

六、实例完整源代码


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

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

pygame gif,Pygame,pygame,python,游戏,游戏程序,GIF
百度图片搜索的素材

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

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

pygame gif,Pygame,pygame,python,游戏,游戏程序,GIF
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图片精灵的播放。以下是游戏运行效果图:

pygame gif,Pygame,pygame,python,游戏,游戏程序,GIF
游戏运行效果图

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

参考代码:

    def update(self):
        # 在屏幕的水平方向上移动
        self.rect.x -= self.speed
        # 当播放到gif最后一帧时,重置为gif第一帧
        if self.now_frame < self.all_frame:
            # 画面每次刷新更新gif的下一帧
            self.now_frame = self.now_frame + 1
        else:
            self.now_frame = 1
        

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

        实现GIF在游戏中显示后又产生了一个新问题,由于游戏设置是60FPS帧率播放的,那么显示这张GIF图片时就过快了,我们需要对精灵对象降低帧率,这里使用了我自己写的公式。

1)self.now_frame = self.now_frame + 1改为self.now_frame = self.now_frame + self.FPS

2)update()方法中增加self.image = self.gif_images[math.floor(self.now_frame)],使用math.floor向下取整达到降帧的效果

PS:当sefl.FPS设置为0.25时则相当于把帧率降低了4倍,现在看上去就正常多了。

pygame gif,Pygame,pygame,python,游戏,游戏程序,GIF
降帧后的效果图

参考代码:

    def update(self):
        # 在屏幕的水平方向上移动
        self.rect.x -= self.speed
        # 当播放到gif最后一帧时,重置为gif第一帧
        if self.now_frame < self.all_frame:
            # 画面每次刷新更新gif的一下一帧
            self.now_frame = self.now_frame + self.FPS
        else:
            self.now_frame = 1
        # 设置pygame当前显示的gif帧
        # 使用math.floor向下取整达到降帧的效果
        self.image = self.gif_images[math.floor(self.now_frame)]

六、实例完整源代码

        好了基本功能全部实现了,部分素材来源网络如有问题请及时联系博主处理,最后贴上实例的完整源代码。

下载地址:

https://download.csdn.net/download/qq616491978/86737107文章来源地址https://www.toymoban.com/news/detail-850742.html

到了这里,关于Python Pygame|实现GIF(gif)动图的加载和降帧【源码+解析】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue项目将多张图片生成一个gif动图

    当前做项目有一个需求是将多张图片生成一个gif动图的形式 类似下面图片几张图片叠加生成一个gif动图 图片涉及工作隐私,就不公开啦  我们要引入一个gif.js的引入包,但是他没有直接引入的方式,只能从官方下载文件包,下载地址:git地址 下载好的包找到下面这个两个文

    2024年02月03日
    浏览(40)
  • Matlab动图保存——GIF制作与视频制作

    在Matlab绘制动图时,若想保存成GIF或视频,可参考以下代码。 (1)GIF格式 (2)视频格式

    2024年02月07日
    浏览(53)
  • Java图片或视频生成GIF动图,发送微信

    别人的博客文章中有动态显示这是怎么做到的呢?别人的微信发送的表情动态为什么是自己鬼畜视频?这些都是别人做到的,本文就是让自己也可以做到以上的事情,制作鬼畜GIF动态,辣就学起来吧! GIF的发明者是美国计算机科学家、GIF图像格式发明人斯蒂芬•威尔海特(

    2024年02月02日
    浏览(55)
  • 怎么从视频中提取动图?一个方法快速提取gif

    视频以连续的方式播放一系列图像帧,通过每秒播放的帧数(帧率)来创做,由于GIF动图则以循环播放一系列静态图像帧的方式展现动画效果。由于视频的优势在于流畅的动画、丰富的细节和长时间播放,因此常用于电影、电视节目、广告等需要高质量动画的场景。而GIF动图

    2024年01月21日
    浏览(39)
  • 图片合成动图怎么弄?gif图制作的简单方法

    许多鬼畜的表情包其实是用图片合成gif完成的,那么怎么将图片转gif呢?使用GIF中文网的gif合成 ( https://www.gif.cn ) 功能,打开浏览器就可以完成gif图片制作,非常简单方便,一起来了解一下吧。 打开网站,在首页选择功能,点击【GIF合成】功能。 选择图片上传,点击生成

    2024年02月12日
    浏览(42)
  • 怎样将手机视频转换成图片?手机怎么把视频做成gif动图?

    怎样将手机视频转换成图片?一般在需要将视频转换成gif格式的图片时,需要在电脑上使用专业的视频处理软件进行操作,但是现在有很多视频素材是从手机上保存的,如果需要从手机上把视频转gif应该怎么操作呢?今天就来给大家推荐一款视频转gif工具,无需下载打开即可

    2024年02月11日
    浏览(51)
  • 【MATLAB】将机械臂运动轨迹输出为avi视频或是gif动图

    使用 VideoWriter 函数创建一个名为“直线轨迹.avi”的视频文件,并设置视频的帧率为 10 帧每秒。 使用 robot0.plot 函数绘制初始关节角度为 [17, 15, 15, 15, 15, 15] 的机器人,并使用 plot3 函数绘制机器人的 轨迹 。 在绘制轨迹时,需要使用 squeeze 函数将机器人末端执行器的位姿矩阵

    2024年02月08日
    浏览(44)
  • 手机上怎么制作动图?两招教你手机在线制作gif动画

    想要在手机上制作gif动态图片,还不想下载软件的时候要怎么办呢?很简单,下面给大家分享两招在线gif制作(https://www.gif.cn/)的工具,不需要下载任何软件。小白也能轻松上手,支持原画质导出,图片无损处理。方便快捷省时省力,方法如下: 方法1:手机端图片合成gif

    2024年02月09日
    浏览(120)
  • STM32 F103C8T6学习笔记10:OLED显示屏GIF动图取模—简易时钟—动图手表的制作~

    今日尝试做一款有动图的OLED实时时钟,本文需要现学一个OLED的GIF动图取模 其余需要的知识点有不会的可以去我  STM32 F103C8T6学习笔记  系列专栏自己查阅把,闲话不多,直接开肝~~~ 文章提供源码,测试工程下载,测试效果图。 做个简易的时钟,就不把RTC实时时钟放进来学了

    2024年02月12日
    浏览(58)
  • 音视频剪辑|FFMPEG|windows10下的音视频格式转换,遮挡填充,GIF动图制作,背景音频抽取,替换

    最近对于音视频和图像的处理问题比较感兴趣,但发现很多目前需要的功能要么需要付费但不会过于麻烦,要么比较麻烦,很可能某个功能实现需要安装很多软件 例如,视频转GIF动图,该功能的实现要么使用Photoshop全家桶,要么找在线网站,或者是wps充会员,或者找其它方法

    2024年02月20日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包