最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)GIF動圖加載和降幀的方法詳解

 更新時間:2023年02月15日 10:02:55   作者:神奇代碼在哪里_  
這篇文章主要為大家詳細介紹了如何利用Python和Pygame實現(xiàn)GIF動圖加載和降幀的效果,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

最近在使用pygame開發(fā)游戲,練習(xí)python編程。但遇到了一個問題,就是如何載入已有的GIF動圖增強游戲的效果,在csdn搜索了一下,發(fā)現(xiàn)相關(guān)的文章比較少,缺少實例。于是自己研究了相關(guān)內(nèi)容,找到了解決方案。本篇文章用游戲編程實例介紹pygame如何載入GIF動圖。

一、準備一份透明背景的GIF動畫素材

首先在網(wǎng)絡(luò)上找一張背景透明的GIF動圖,注意需要背景透明的,不然在游戲中就會顯示一個矩形圖片,會擋住游戲的背景。以下就是百度圖片搜索找到的背景透明的GIF動圖。

百度圖片搜索的素材

二、使用pillow庫對GIF動圖進行解幀

使用pillow庫的Image、ImageSequence包對圖片進行解幀后發(fā)現(xiàn),這張下載的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):
        # 調(diào)用父類的初始化方法
        super().__init__()
        # 使用pillow的image打開GIF動圖
        pillow_image = Image.open(image_name)
        index = 1
        # 使用pillow的ImageSequence獲取GIF動圖所有幀對應(yīng)的迭代器
        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動圖所包含的所有幀數(shù),這里index循環(huán)結(jié)束后為11,由于數(shù)組從0開始計算,所以為11-2=9。

2)now_frame為當前游戲的幀,一開始設(shè)置為0。

3)gif_images為存儲GIF動圖的幀列表。

4)循環(huán)讀取所有幀,添加到gif_images[]中。

5)游戲開始時設(shè)置顯示第一幀圖片。

參考代碼:

# 定義對象的屬性
# 1.all_frame為GIF動圖所包含的所有幀數(shù),這里index循環(huán)結(jié)束后為11,由于數(shù)組從0開始計算,所以為11-2=9
self.all_frame = index - 2
# 2.now_frame為當前游戲的幀,一開始設(shè)置為0
self.now_frame = 0
# 3.gif_images為存儲GIF動圖的幀列表
self.gif_images = []
# 4.循環(huán)讀取所有幀,添加到gif_images[]中
for i in range(1, index):
    self.gif_images.append(pygame.image.load(f"./images/bird/gif{i}.png"))
# 5.游戲開始時設(shè)置顯示第一幀圖片
self.image = self.gif_images[self.now_frame]

四、在精靈類的update()方法中循環(huán)播放列表中的幀

pygame在每次畫面刷新時會調(diào)用每個精靈類的update()方法,所以我們只要在該方法下實現(xiàn)循環(huán)播放這10幀圖片就可以實現(xiàn)含有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

五、避免精靈幀率過快對精靈進行降幀

實現(xiàn)GIF在游戲中顯示后又產(chǎn)生了一個新問題,由于游戲設(shè)置是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設(shè)置為0.25時則相當于把幀率降低了4倍,現(xiàn)在看上去就正常多了。

降幀后的效果圖

參考代碼:

    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
        # 設(shè)置pygame當前顯示的gif幀
        # 使用math.floor向下取整達到降幀的效果
        self.image = self.gif_images[math.floor(self.now_frame)]

到此這篇關(guān)于Python實現(xiàn)GIF動圖加載和降幀的方法詳解的文章就介紹到這了,更多相關(guān)Python動圖加載降幀內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pytorch之contiguous的用法

    Pytorch之contiguous的用法

    今天小編就為大家分享一篇Pytorch之contiguous的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中常用腳本集錦分享

    Python中常用腳本集錦分享

    這篇文章為大家收集了一些常用Python腳本,作為平時練手使用,也可以作為自己的筆記,希望對大家有一定的幫助
    2024-11-11
  • Python字符串處理的8招秘籍(小結(jié))

    Python字符串處理的8招秘籍(小結(jié))

    這篇文章主要介紹了Python字符串處理的8招秘籍,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python機器學(xué)習(xí)應(yīng)用之基于決策樹算法的分類預(yù)測篇

    Python機器學(xué)習(xí)應(yīng)用之基于決策樹算法的分類預(yù)測篇

    所謂決策樹,就是一個類似于流程圖的樹形結(jié)構(gòu),樹內(nèi)部的每一個節(jié)點代表的是對一個特征的測試,樹的分支代表該特征的每一個測試結(jié)果,而樹的每一個葉子節(jié)點代表一個類別。樹的最高層是就是根節(jié)點
    2022-01-01
  • Flask sqlalchemy一對多與多對一與一對一及多對多關(guān)系介紹

    Flask sqlalchemy一對多與多對一與一對一及多對多關(guān)系介紹

    這篇文章主要介紹了Flask sqlalchemy一對多與多對一與一對一及多對多關(guān)系介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • 使用Python圖像處理庫Pillow處理圖像文件的案例分析

    使用Python圖像處理庫Pillow處理圖像文件的案例分析

    本文將通過使用Python圖像處理庫Pillow,幫助大家進一步了解Python的基本概念:模塊、對象、方法和函數(shù)的使用,文中代碼講解的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 在 Python 中解析 ISO 8601 日期的詳細過程

    在 Python 中解析 ISO 8601 日期的詳細過程

    這篇文章主要介紹了在 Python 中解析 ISO 8601 日期,我們將討論典型的 ISO 8601 日期的結(jié)構(gòu),并向您展示如何將典型的 DateTime 對象解析為可以在所有地方使用的標準化 DateTime,需要的朋友可以參考下
    2023-08-08
  • Python?pyinstaller打包exe最新完整圖文教程

    Python?pyinstaller打包exe最新完整圖文教程

    pyinstaller是一個非常簡單的打包python的py文件的庫,下面這篇文章主要給大家介紹了關(guān)于Python?pyinstaller打包exe的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Python如何輸出百分比

    Python如何輸出百分比

    這篇文章主要介紹了Python 如何輸出百分比,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于flask路由app.route及路由參數(shù)的各種用法解析

    關(guān)于flask路由app.route及路由參數(shù)的各種用法解析

    我們在開發(fā)過程中,編寫項目時所使用的路由往往是指代了框架/項目中用于完成路由功能的類,這個類一般就是路由類,簡稱路由,這篇文章主要介紹了有關(guān)flask路由app.route及路由參數(shù)的各種用法解析,需要的朋友可以參考下
    2024-03-03

最新評論

陇川县| 岢岚县| 铜梁县| 喀什市| 九江市| 高州市| 甘谷县| 赤峰市| 普兰店市| 石阡县| 化隆| 大同市| 社旗县| 玉山县| 邹平县| 宝兴县| 桂平市| 崇义县| 海盐县| 张家口市| 丰原市| 神木县| 从江县| 江阴市| 达日县| 金堂县| 饶河县| 杂多县| 武清区| 铜梁县| 阿瓦提县| 县级市| 绥化市| 兴仁县| 宽城| 泰和县| 石门县| 澎湖县| 左权县| 济南市| 玉山县|