背景
在使用Gitee作為圖床時(使用Typora+gitee+堅果雲實現文件同步 - 掘金 (juejin.cn)),當插入的圖片大小超過1MB時,會無法正常顯示,如下圖:
這就很讓人頭痛,比較一勞永逸的辦法是使用雲端儲存服務作為圖床(如七牛雲,阿里雲的儲存服務),如果對圖片清晰度要求不是很高時,也可以通過壓縮圖片大小,使其小於1MB,再上傳至Gitee圖床。本文主要講述使用Tinypng來壓縮圖片。
Tinypng簡介
TinyPNG 使用智慧有失真壓縮技術來減小 WEBP、JPEG 和 PNG 檔案的檔案大小。 通過有選擇地減少影像中的顏色數量,儲存資料所需的位元組更少。
連結:TinyPNG – Compress WebP, PNG and JPEG images intelligently
Tinypng使用
手動上傳圖片
Tinypng可以手動單次上傳20張圖片(小於5MB)進行壓縮處理,實測國內網路速度也相當可觀!壓縮完成後的圖片名稱與原圖片一致,可以直接進行替換處理。實測效果如下圖,是比較符合我們預期的。
壓縮完的圖片(800KB)實際效果,還是很不錯的。
使用API
在Tinypng網站可以找到Developer API
標籤頁,在該標籤頁中輸入自己的郵箱即可收到Tinypng提供的API KEY
的訪問連結,
下圖即是Tinypng的API Dshboard
,在這個頁面我們可以看到自己的API Key,在指令碼中使用需要使用該KEY進行身份校驗。同時,該頁面也會顯示免費額度的使用情況,每個郵箱使用者每月有500張圖片壓縮使用額度。我們的使用需求是超過1MB大小的圖片進行壓縮,因此這個額度足夠我們使用了。
呼叫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()
示例
原資料夾:
執行指令碼
執行後
可以看到超過1MB的圖片已經進行了壓縮。
其他
官方文件的教學中,可以壓縮後直接上傳Amazon S3
和Google Cloud Storage
, Gitee
應該也是可以的,有時間了檢視下原始碼看看如何直接上傳Gitee
.