Python結合Pngquant給工程作圖片批量壓縮

前言

目前Android工程 APK包體積逐漸增大,從壓縮圖片來講是一個解決方案,可是目前網上都沒有什麼好用的傻瓜式的批量壓縮方案,無心中發現Pngquant能夠去作這一件事,可是也只能單個文件夾壓縮,沒法遍歷整個工程文件進行圖片壓縮處理。python

在這個背景下,我以爲開發一個Python腳本結合Pngquant去作這件事情仍是有必要的git

環境搭建

  • Python版本 :3.7.9,網上都有教程這裏不在贅述怎麼搭建
  • PyCharm IDE:直接去官網下載便可
  • Pngquant:直接去官網下載,而後加入到環境變量,在命令行能夠運行pngquant -h沒問題便可

Git源碼

github.com/RmondJone/P…github

下載源碼以後,進行下面的步奏便可:數組

  • 第一步:config.ini 配置須要的壓縮的文件夾
  • 第二步:運行main.py
  • 第三步:根據提示輸入要壓縮的文件夾,這裏只需輸入最上層目錄便可,程序自動檢索配置文件匹配

腳本介紹

config.inimarkdown

[config]
#須要壓縮的文件夾名稱,多個以空格分隔
compressDir = drawable-hdpi drawable-xhdpi drawable-xxhdpi drawable-xxxhdpi mipmap-hdpi mipmap-xhdpi mipmap-xxhdpi mipmap-xxxhdpi
複製代碼

main.pyapp

import os
import threading
from config import global_config


# 壓縮線程(同步壓縮)
class CompressThread(threading.Thread):
    # 構造方法
    def __init__(self, compressDir) -> None:
        threading.Thread.__init__(self)
        self.compressDir = compressDir

    # 運行方法
    def run(self) -> None:
        print("線程開始運行,壓縮路徑爲:" + self.compressDir)
        # 得到鎖
        threadLock.acquire()
        cmd = "pngquant 256 --quality=65-80 --skip-if-larger --force --ext .png " + self.compressDir + "\\*.png"
        os.system(cmd)
        # 釋放鎖
        threadLock.release()
        print("線程結束運行,壓縮路徑爲:" + self.compressDir)


if __name__ == '__main__':
    configDirStr = global_config.getRaw("config", "compressDir")
    configDir = configDirStr.split(" ")
    print("當前配置須要壓縮的文件夾爲:")
    print(configDir)
    a = """
 _____ _             _____                                     _   
|  __ (_)           |  __ \                                   | |  
| |__) |  ___ ______| |__) | __   __ _  __ _ _   _  __ _ _ __ | |_ 
|  ___/ |/ __|______|  ___/ '_ \ / _` |/ _` | | | |/ _` | '_ \| __|
| |   | | (__       | |   | | | | (_| | (_| | |_| | (_| | | | | |_ 
|_|   |_|\___|      |_|   |_| |_|\__, |\__, |\__,_|\__,_|_| |_|\__|
                                  __/ |   | |                      
                                 |___/    |_|     
                                 
請選擇須要壓縮的文件夾路徑:                                    
"""
print(a)
dirPath = input("請輸入:")
# 初始化線程鎖
threadLock = threading.Lock()
# 壓縮線程數組
threads = []
# 開始歷遍全部子文件夾
for root, dirs, files in os.walk(dirPath):
    for dir in dirs:
        if dir in configDir:
            # 過濾編譯文件夾
            if "build\generated" not in os.path.join(root, dir):
                thread = CompressThread(os.path.join(root, dir))
                threads.append(thread)
                thread.start()

# 開始遍歷執行壓縮線程
for thread in threads:
    thread.join()

複製代碼

核心代碼,主要就是使用python去遍歷配置文件中定義的要壓縮的文件夾,而後建立同步線程執行Pngquant壓縮處理。oop

  • --quality=65-80:壓縮圖片質量爲65-80
  • --skip-if-larger:捨棄意義不大的壓縮
  • --ext .png:這個是由於默認它會將解壓縮後的Png文件重命名加後綴,這個參數即將重命名後加了一個空的字符的後綴,即等於不重命名了
  • --force:不重命名後等於要覆蓋原來的文件了,這裏即強制覆蓋原來的文件
相關文章
相關標籤/搜索