返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现GIF动图加载和降帧的方法详解
  • 595
分享到

Python实现GIF动图加载和降帧的方法详解

Python动图加载Python动图降帧Python动图 2023-02-15 12:02:21 595人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、准备一份透明背景的GIF动画素材二、使用pillow库对GIF动图进行解帧三、使用pygame.image.load()读取所有解出来的帧并存入列表四、在精灵类的updat&

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

一、准备一份透明背景的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的下一帧

参考代码:

    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倍,现在看上去就正常多了。

降帧后的效果图

参考代码:

    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)]

到此这篇关于python实现GIF动图加载和降帧的方法详解的文章就介绍到这了,更多相关Python动图加载降帧内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python实现GIF动图加载和降帧的方法详解

本文链接: https://lsjlt.com/news/196175.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python实现GIF动图加载和降帧的方法详解
    目录一、准备一份透明背景的GIF动画素材二、使用pillow库对GIF动图进行解帧三、使用pygame.image.load()读取所有解出来的帧并存入列表四、在精灵类的updat&...
    99+
    2023-02-15
    Python动图加载 Python动图降帧 Python动图
  • JS实现获取GIF总帧数的方法详解
    目录前言写在前面思路分析什么是Gif组成结构解析原理数据块分析Header BlockLogical Screen DescriptorGlobal Color TableGraph...
    99+
    2024-04-02
  • AndroidFlutter实现GIF动画效果的方法详解
    目录前言交错动画机制代码实现Interval 介绍总结前言 我们之前介绍了不少有关动画的篇章。前面介绍的动画都是只有一个动画效果,那如果我们想对某个组件实现一组动效,比如下面的效果,...
    99+
    2024-04-02
  • Python实现GIF动图以及视频卡通化详解
    目录前言环境依赖核心代码gif动图卡通化视频卡通化总结前言 参考文章:Python实现照片卡通化 我继续魔改一下,让该模型可以支持将gif动图或者视频,也做成卡通化效果。毕竟一张图可...
    99+
    2024-04-02
  • python中动态加载模块和类方法实现
    python中动态加载模块和类方法实现测试代码   文件名: mytest.py 具体代码如下:   注意:模块名,类名,方法名都是变量。   #coding=UTF-8 class TestClass: def sub(se...
    99+
    2023-01-31
    模块 加载 方法
  • 基于Python实现配置热加载的方法详解
    目录背景如何实现使用多进程实现配置热加载使用signal信号量来实现热加载采用multiprocessing.Event 来实现配置热加载结语背景 由于最近工作需求,需要在...
    99+
    2024-04-02
  • Python实现从文件中加载数据的方法详解
    前几篇都是手动录入或随机函数产生的数据。实际有许多类型的文件,以及许多方法,用它们从文件中提取数据来图形化。 比如之前python基础(12)介绍打开文件的方式,可直接读取文件中的数...
    99+
    2024-04-02
  • 图文详解梯度下降算法的原理及Python实现
    目录1.引例2.数值解法3.梯度下降算法4.代码实战:Logistic回归1.引例 给定如图所示的某个函数,如何通过计算机算法编程求f(x)min? 2.数值解法 传统方法是数值解...
    99+
    2024-04-02
  • Android 实现加载大图片的方法
    项目简介: 该项目为加载大图片 详细介绍: 对于超大的图片,如果不缩放的话,容易导致内存溢出。而经过处理后,无论多大的图片,都能够在手机屏幕上加载出来,不会导致内存溢出。当然,...
    99+
    2022-06-06
    方法 图片 Android
  • SpringMVC bean实现加载控制方法详解
    目录1、Spring配置类排除加载SpringMVC的bean2、Servlet容器配置类简洁开发1、Spring配置类排除加载SpringMVC的bean SpringMVC 通常...
    99+
    2024-04-02
  • Java文件重定向和加载的原理和实现方法详解。
    Java文件重定向和加载的原理和实现方法详解 Java文件重定向和加载是Java开发中常用的技术,它们可以帮助我们更好地管理程序的输入输出和加载类文件。本文将详细介绍Java文件重定向和加载的原理和实现方法,并给出相应的演示代码。 一、Ja...
    99+
    2023-09-05
    文件 重定向 load
  • Linux实现自动挂载autofs的方法详解
    目录实现自动挂载-autofsautofs工具简单使用autofs配置详细说明自动挂载资源有两种格式优化 linux 系统性能安装 Tuned选择调整配置文件检查系统推荐的调整配置文件实现自动挂载-autofs auto...
    99+
    2024-04-02
  • CSS实现加载动画效果的技巧和方法
    随着互联网的发展,加载速度成为了用户体验的重要指标之一。为了提升页面加载时的用户体验,我们通常会使用加载动画效果来增加页面的互动性和吸引力。而CSS作为前端开发中的重要技术之一,提供了许多实现加载动画效果的技巧和方法。本文将介绍几种常见的C...
    99+
    2023-10-21
    旋转 CSS加载动画效果
  • JavaScript图片懒加载的优化方法详解
    目录一、方法一二、方法二 InterSectionObserver总结一、方法一 重点: 1.getBoundingClientRect().top > window.inn...
    99+
    2024-04-02
  • Android ListView实现ImageLoader图片加载的方法
    本文实例讲述了Android ListView实现ImageLoader图片加载的方法。分享给大家供大家参考,具体如下:最近一直忙着做项目,今天也是忙里偷闲,想写篇博客来巩固下之前在应用中所用的知识。之前我们可能会也会肯定遇到了图片的异步加...
    99+
    2023-05-30
    android listview imageloader
  • Oracle数据加载和卸载的实现方法
    在日常工作中;经常会遇到这样的需求: Oracle 数据表跟文本或者文件格式进行交互;即将指定文件内容导入对应的 Oracle 数据表中;或者从 Oracle 数据表导出。 其他数据库中的表跟Or...
    99+
    2024-04-02
  • Android实现滑动加载数据的方法
    本文实例讲述了Android实现滑动加载数据的方法。分享给大家供大家参考。具体实现方法如下: EndLessActivity.java如下: package com.Scro...
    99+
    2022-06-06
    方法 数据 Android
  • Python生成直方图方法实现详解
    目录1. 引言2. 生成数据3. 使用Matplotlib绘制直方图4. 使用Pandas绘制直方图5. 总结1. 引言 你想知道如何在Python中生成直方图吗?在本教程中,我将向...
    99+
    2022-11-16
    Python生成直方图 Python直方图 Python绘制直方图
  • Java实现添加,读取和删除Excel图片的方法详解
    目录介绍Java 代码示例示例1添加图片示例2读取图片示例3删除图片介绍 本文介绍在Java程序中如何添加图片到excel表格,添加图片时可设置图片大小、位置、旋转、超链接...
    99+
    2024-04-02
  • 详解JavaScript两个实用的图片懒加载优化方法
    目录一、方法一二、方法二 InterSectionObserver一、方法一 重点: 1.getBoundingClientRect().top > window.inner...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作