使用tinypng對需要上傳Gitee圖床的圖片進行壓縮

zyfzjuer發表於2021-10-18

背景

在使用Gitee作為圖床時(使用Typora+gitee+堅果雲實現文件同步 - 掘金 (juejin.cn)),當插入的圖片大小超過1MB時,會無法正常顯示,如下圖:
image-20211018191743136

這就很讓人頭痛,比較一勞永逸的辦法是使用雲端儲存服務作為圖床(如七牛雲,阿里雲的儲存服務),如果對圖片清晰度要求不是很高時,也可以通過壓縮圖片大小,使其小於1MB,再上傳至Gitee圖床。本文主要講述使用Tinypng來壓縮圖片。

Tinypng簡介

TinyPNG 使用智慧有失真壓縮技術來減小 WEBP、JPEG 和 PNG 檔案的檔案大小。 通過有選擇地減少影像中的顏色數量,儲存資料所需的位元組更少。

連結:TinyPNG – Compress WebP, PNG and JPEG images intelligently

image-20211018192811225

Tinypng使用

手動上傳圖片

Tinypng可以手動單次上傳20張圖片(小於5MB)進行壓縮處理,實測國內網路速度也相當可觀!壓縮完成後的圖片名稱與原圖片一致,可以直接進行替換處理。實測效果如下圖,是比較符合我們預期的。

image-20211018193405146

壓縮完的圖片(800KB)實際效果,還是很不錯的。

image-20211018193543461
使用API

在Tinypng網站可以找到Developer API標籤頁,在該標籤頁中輸入自己的郵箱即可收到Tinypng提供的API KEY的訪問連結,

image-20211018193732011

下圖即是Tinypng的API Dshboard,在這個頁面我們可以看到自己的API Key,在指令碼中使用需要使用該KEY進行身份校驗。同時,該頁面也會顯示免費額度的使用情況,每個郵箱使用者每月有500張圖片壓縮使用額度。我們的使用需求是超過1MB大小的圖片進行壓縮,因此這個額度足夠我們使用了。

image-20211018193939561

呼叫API自動上傳超過1MB圖片

我們可以自己編寫python指令碼通過呼叫API來實現圖片的自動上傳壓縮。API教程可以參考官方文件:TinyPNG – API Reference

安裝tinyfy

我們可以使用以下命令安裝tinify,可以在Github找到原始碼。

pip install --upgrade tinify

自動上傳指令碼

我自己簡單寫了個指令碼,執行該指令碼時需傳入圖片路徑,當圖片大於1MB大小時,上傳Tinypng進行壓縮。

# python 2.7
import tinify
import os
import sys

tinify.key = "xxxxxxxxxxxxxxxx" # API Dashboard中的API Key


class Tinify():

    def __init__(self):
        self.path = ' '.join(sys.argv[1:])

    def get_fileSize(self, filePath):  
        fsize = os.path.getsize(filePath)
        fsize = fsize / float(1024 * 1024)
        print 'fileSize is %s' % round(fsize, 2)
        return round(fsize, 2)

    def get_tinify(self):
        file_list = os.listdir(self.path)
        for f in file_list:
            if f.endswith('png') or f.endswith('webp') or f.endswith('jpeg') or f.endswith('jpg'): 
                complete_path = self.path + '\\' + f
                print complete_path
                if self.get_fileSize(complete_path) > 1: # 圖片大小超過1MB時,進行壓縮
                    source = tinify.from_file(complete_path)
                    source.to_file(complete_path)
                    print "%s compress successful." % f


if __name__ == '__main__':
    a = Tinify()
    a.get_tinify()

示例

原資料夾:

image-20211018200756122

執行指令碼

image-20211018200824978

執行後

image-20211018201525034

image-20211018201543646

可以看到超過1MB的圖片已經進行了壓縮。

其他

官方文件的教學中,可以壓縮後直接上傳Amazon S3Google Cloud Storage, Gitee應該也是可以的,有時間了檢視下原始碼看看如何直接上傳Gitee.

相關文章