成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Python對Gif進行壓縮

開發 后端
眾所周知,gif圖就是由若干組圖片組成的一種文件格式,有多張有一定差異的圖片連續播放,間隔時間較小,欺騙了我們的眼睛和大腦,然后我們以為是一個完全連續的。其實就是一個類似快速翻書的操作。

[[426653]]

本文轉載自微信公眾號「arige」,作者arige。轉載本文請聯系arige公眾號。

 一、背景

前天在給微信公眾號上傳文章的時候,文章里面有一個圖片是gif的,在上傳的過程中報錯了,說是圖片超大了。搜索之后發現圖片需要小于5m。

那么問題就轉化為怎么把當前的gif給縮減到5m以內本著有輪子用輪子,沒有輪子造輪子的精神,網上搜索一番。

發現一些現象

1、壓縮要不就是需要會員才能下載;

2、要不免費的只能壓縮5m以下的。

考慮到能動手不花錢的本性,我覺得要自己搞一下。

知識背景:

眾所周知,gif圖就是由若干組圖片組成的一種文件格式,有多張有一定差異的圖片連續播放,間隔時間較小,欺騙了我們的眼睛和大腦,然后我們以為是一個完全連續的。其實就是一個類似快速翻書的操作。

二、方案選型

方案一

因為gif是有多種圖片做的,那我們就考慮把圖片減少一些,比如說原來是100張是10m,我給縮減到10張,那體積可不就要縮小到1m左右了嗎?當然,為了用戶看起來不是那么卡頓,我就拍腦袋給縮減到20張吧,即只有原來的1/5。

方案二

如果縮減的圖片太多導致gif看起來卡頓的話,我們可以考慮不縮減圖片的張數,但是我們可以壓縮圖片。

方案三

最后的都是重要的,如果前面兩個都無法滿足的話,那就可以考慮把他們進行疊加。先減張數,再壓縮拆分的圖片。

三、項目落實

整體流程如下:

  1. if __name__ == "__main__"
  2.    # 設置源gif的地址 
  3.    sourceGifPath = "/Users/user/test/f79a3e2c2e864863a6b1a66791cb0950_tplv-k3u1fbpfcp-watermark.gif" 
  4.    # 將gif拆分成多個圖片,并保存在本地 
  5.    SplitGif(sourceGifPath) 
  6.    # 將指定位置的文件下的圖片按照文件名索引排序,做成gif 
  7.    Combine2Gif(sourceGifPath[:-4], sourceGifPath[:-4] + "_result.gif"
  8.    print("== finished =="

1、將源gif讀入內存

2、將gif拆分成png,并保存

  1. def SplitGif(gifPath): 
  2.    # 獲取png存儲的文件夾的地址 
  3.    pngDir = gifPath[:-4] 
  4.    # 要存儲的文件夾下清理干凈,避免影響當前操作 
  5.    rmPngDir(pngDir) 
  6.    # 創建存儲的文件夾 
  7.    os.mkdir(pngDir) 
  8.    # 把指定gif拆分后存儲到指定文件夾 
  9.    savePngToDir(gifPath, pngDir) 

2.1、獲取要存儲的地址

2.2、清空并移除存儲png的文件夾

  1. def rmPngDir(pngDir): 
  2.    if os.path.exists(pngDir): 
  3.        files = os.listdir(pngDir) 
  4.        # 如果不一個一個的移除文件夾下的文件的話,無法移除文件夾 
  5.        for file in files: 
  6.            file = pngDir + "/" + file 
  7.            os.remove(file) 
  8.        os.rmdir(pngDir) 

2.3、創建存儲png的文件夾

2.4、將gif拆分成png,并保存

  1. def savePngToDir(gifPath, pngDir): 
  2.    # 通過路徑傳教image對象 
  3.    image = Image.open(gifPath) 
  4.    try: 
  5.        # 循環,通過異常方案退出循環 
  6.        while True
  7.            # 獲取當前的索引的位置 
  8.            current = image.tell() 
  9.            # 創建文件路徑 
  10.            pngPath = pngDir + '/' + str(current) + '.png' 
  11.            image.save(pngPath, quality=100) 
  12.            # 索引后移,越界后異常,退出當前循環 
  13.            image.seek(current + 1) 
  14.    except EOFError as e: 
  15.        print(e) 
  16.        pass 

3、按照一定的間隔讀取2中的png,并生成gif

  1. def Combine2Gif(folderPath, gifFilePath): 
  2.    GenerateGif(0.1, gifFilePath, getPngArray(folderPath)) 

3.1、獲取所有的png

  1. def getPngArray(folderPath): 
  2.    files = os.listdir(folderPath) 
  3.    pngFiles = [] 
  4.    # 通過設置step,將文件的大小修改為原來的體積的1/step 
  5.    for i in range(0, len(files), 5): 
  6.        pngFiles.append(folderPath + "/" + ('%d.png' % i)) 
  7.    return pngFiles 

3.2、將png合并成gif

  1. def GenerateGif(step, gifPath, filterPngs): 
  2.    images = [] 
  3.    for filePath in filterPngs: 
  4.        images.append(imageio.imread(filePath)) 
  5.    # 生成gif,duration 是播放兩個圖片之間的間隔時間 
  6.    imageio.mimsave(gifPath, images, duration=step) 

四、全部的代碼

  1. #! /usr/local/bin/python3 
  2. # -*- coding: utf-8 -*- 
  3. from PIL import Image 
  4. import os 
  5. import imageio 
  6.  
  7.  
  8. def SplitGif(gifPath): 
  9.    # 獲取png存儲的文件夾的地址 
  10.    pngDir = gifPath[:-4] 
  11.    # 要存儲的文件夾下清理干凈,避免影響當前操作 
  12.    rmPngDir(pngDir) 
  13.    # 創建存儲的文件夾 
  14.    os.mkdir(pngDir) 
  15.    # 把指定gif拆分后存儲到指定文件夾 
  16.    savePngToDir(gifPath, pngDir) 
  17.  
  18.  
  19. def rmPngDir(pngDir): 
  20.    if os.path.exists(pngDir): 
  21.        files = os.listdir(pngDir) 
  22.        # 如果不一個一個的移除文件夾下的文件的話,無法移除文件夾 
  23.        for file in files: 
  24.            file = pngDir + "/" + file 
  25.            os.remove(file) 
  26.        os.rmdir(pngDir) 
  27.  
  28.  
  29. def savePngToDir(gifPath, pngDir): 
  30.    # 通過路徑傳教image對象 
  31.    image = Image.open(gifPath) 
  32.    try: 
  33.        # 循環,通過異常方案退出循環 
  34.        while True
  35.            # 獲取當前的索引的位置 
  36.            current = image.tell() 
  37.            # 創建文件路徑 
  38.            pngPath = pngDir + '/' + str(current) + '.png' 
  39.            image.save(pngPath, quality=100) 
  40.            # 索引后移,越界后異常,退出當前循環 
  41.            image.seek(current + 1) 
  42.    except EOFError as e: 
  43.        print(e) 
  44.        pass 
  45.  
  46.  
  47. def Combine2Gif(folderPath, gifFilePath): 
  48.    GenerateGif(0.1, gifFilePath, getPngArray(folderPath)) 
  49.  
  50.  
  51. # 獲取文件的數組 
  52. def getPngArray(folderPath): 
  53.    files = os.listdir(folderPath) 
  54.    pngFiles = [] 
  55.    # 通過設置step,將文件的大小修改為原來的體積的1/step 
  56.    for i in range(0, len(files), 5): 
  57.        pngFiles.append(folderPath + "/" + ('%d.png' % i)) 
  58.    return pngFiles 
  59.  
  60.  
  61. def GenerateGif(step, gifPath, filterPngs): 
  62.    images = [] 
  63.    for filePath in filterPngs: 
  64.        images.append(imageio.imread(filePath)) 
  65.    # 生成gif,duration 是播放兩個圖片之間的間隔時間 
  66.    imageio.mimsave(gifPath, images, duration=step) 
  67.  
  68.  
  69. if __name__ == "__main__"
  70.    # 設置源gif的地址 
  71.    sourceGifPath = "/Users/user/test/f79a3e2c2e864863a6b1a66791cb0950_tplv-k3u1fbpfcp-watermark.gif" 
  72.    # 將gif拆分成多個圖片,并保存在本地 
  73.    SplitGif(sourceGifPath) 
  74.    # 將指定位置的文件下的圖片按照文件名索引排序,做成gif 
  75.    Combine2Gif(sourceGifPath[:-4], sourceGifPath[:-4] + "_result.gif"
  76.    print("== finished =="

五、結尾

作為一個追求高效的程序員,我就做一個能滿足我需求的方案,即方案一。至于方案二和方案三,有興趣的朋友可以舉一反三。

 

責任編輯:武曉燕 來源: arige
相關推薦

2017-09-26 19:02:09

PythonInstagram數據分析

2022-11-07 07:54:05

微服務數據庫網關

2010-02-02 14:11:14

Python 進行編程

2023-07-05 07:36:36

SpringJava代碼

2021-11-26 08:45:06

NetworKi網絡安全分析安全工具

2010-06-04 13:50:24

MySQL存儲過程

2019-10-11 18:27:18

APK資源壓縮

2023-04-12 08:00:00

人工智能ChatGPTPython

2020-10-15 12:00:01

Python 開發編程語言

2021-02-22 13:44:41

開發Python金融

2021-11-04 05:43:38

GoKartGo代碼靜態安全分析

2014-05-21 14:03:55

日志監控VDI

2014-05-21 09:14:00

VDI審計日志監控監控

2013-03-02 18:00:38

軟件加密軟件授權WinLicense

2021-06-15 20:59:14

Kubernetes調試容器

2021-05-09 22:48:40

SQL數據庫變量

2023-12-12 07:30:54

IstioWasm前端

2011-01-20 10:33:30

Postfix

2023-01-30 08:30:09

Tomcat性能優化

2010-05-26 18:43:42

SVN庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区在线 | 日日爱av| 九九亚洲| 成人中文字幕在线 | 日本国产高清 | 99亚洲| 亚洲免费三级 | 91在线看网站 | 亚洲日本一区二区 | caoporon| 成人午夜视频在线观看 | 日韩欧美一级精品久久 | 99re国产| 日韩在线免费电影 | 免费h在线 | 日本啊v在线| 亚洲欧洲一区 | 精品在线一区 | 亚洲国产一区二区三区在线观看 | 一级黄色夫妻生活 | 在线成人 | 久久久精品网站 | 国产一区二区在线观看视频 | 久久精品国产久精国产 | 欧美黄视频 | 成人国产精品免费观看 | 特级毛片www | 中文字幕一级毛片视频 | 日本超碰 | 亚洲免费人成在线视频观看 | 免费黄色的视频 | 欧美伊人久久久久久久久影院 | 91av精品| 激情a| 国产免费高清 | 亚洲一区二区在线视频 | 久草.com | 超碰在线播 | 欧美成年人网站 | 国产 欧美 日韩 一区 | 免费v片在线观看 |