移動開發時批處理壓縮圖片提高開發效率

o動感超人o發表於2021-07-05

1. 為什麼要壓縮圖片?

在UI給開發圖片的時候,經常都是沒有壓縮過的原圖,但是移動開發時要儘可能減小app體積,而圖片在app體積中佔比極大,所以將大圖壓縮為小容量圖片並且儘可能不影響圖片質量是減小app體積所必須的操作

2. 如何壓縮?

壓縮方法有很多,網上各種壓縮工具,傳統壓縮方法是UI給了圖用這些工具批量壓縮,缺點就是要手動選擇不同資料夾下的圖片,不能做到自定義

3. 壓縮為什麼格式?

但是現在流行的是壓縮為webp格式,WebP 的優勢體現在它具有更優的影像資料壓縮演算法,能帶來更小的圖片體積,而且擁有肉眼識別無差異的影像質量;同時具備了無損和有損的壓縮模式、Alpha 透明以及動畫的特性,在 JPEG 和 PNG 上的轉化效果都相當優秀、穩定和統一。

4. 用python自動化批處理壓縮的指令碼

直接放指令碼程式碼 檔名compressImage.py

#!/usr/bin/python
# -*- coding:utf8 -*-

# author:liuhc
# description:壓縮指定模組裡的大圖為webp格式
# create date:2020-09-24 on 1:20 PM
import os


# 查詢指定資料夾裡大於指定kb的圖片列表
def findBigImageFile(folder, size):
    bigFiles = []
    for foldername, subfolders, filenames in os.walk(folder):
        # 對檔案進行遍歷
        for filename in filenames:
            # .getsize(path)必須是完整路徑
            file = os.path.join(foldername, filename)
            # size*1024,使引數size單位為kb
            if os.path.getsize(file) > size * 1024:
                file = os.path.abspath(file)
                suffix = os.path.splitext(file)[1]
                if (suffix == ".png" or suffix == ".jpg") and file.find(".9.png") == -1:
                    bigFiles.append(file)
    return bigFiles


# 將modules中的資料夾都新增到集合裡並返回
def saveBigImageFile(modules):
    folders = []
    for module in modules:
        folders.append(module)
    return folders


# modules為當前同級目錄下的圖片資料夾列表
modules = ["assets/images"]
folders = saveBigImageFile(modules)

# 將大於指定kb的檔案都存到bigFiles裡
bigFiles = []
for folder in folders:
    # 查詢指定資料夾裡大於指定kb的圖片列表
    bigFiles += findBigImageFile(folder, 50)

# 壓縮前的大小
beforeCompressSize = 0
# 壓縮後的大小
afterCompressSize = 0
for bigFile in bigFiles:
    absFileName = os.path.splitext(bigFile)[0]
    before = os.path.getsize(bigFile) / 1024
    beforeCompressSize += before
    print("壓縮前", before, "kb")
    cmd = "cwebp -q 75 " + bigFile + " -o " + absFileName + ".webp"
    print(cmd)
    os.system(cmd)
    after = os.path.getsize(absFileName + ".webp") / 1024
    afterCompressSize += after
    print("壓縮後", after)
for bigFile in bigFiles:
    # 轉為webp後刪除原檔案
    os.remove(bigFile)

if beforeCompressSize > 0:
    print("壓縮比", afterCompressSize / beforeCompressSize * 100, "%")
複製程式碼

其中程式碼裡的modules = ["assets/images"]為我們要壓縮的圖片所在的資料夾,路徑是相對python指令碼檔案所在位置的相對路徑 然後開啟Android Studio的Terminal框,輸入python3 compressImage.py即可將我們的圖片資料夾裡大於指定kb的圖片壓縮為webp格式並刪除被壓縮的檔案。

注意事項

上文中的webp命令需要自己安裝對應檔案。Google提供了命令列工具用於將圖片轉換為webp。在Mac下,可以使用homebrew安裝webp工具:

brew install webp

總結

在上面的指令碼里我的modules = ["assets/images"]寫的是Flutter專案的圖片所在路徑,如果是Android專案或者IOS專案填寫對應專案的圖片所在路徑即可。將指令碼拷貝到自己的專案裡,修改modules = ["assets/images"]後,以後UI給了開發圖片,只需要放到對應資料夾然後執行一次該指令碼即可。

demo已放到github,是Flutter專案: github.com/ikakaxi/com…

相關文章