開發目的
我經常使用圖片。公眾號文章發文也好,還是生活中要使用素材。圖片是一種比文字更加直觀的載體。
但是圖片更加佔用頻寬,很多軟體都對圖片有大小限制。圖片太大也會影響載入速度。
我試過幾款圖片壓縮工具,比如 tinypng 和 tinyjpg 非常好用,體驗也非常棒。
但是它存在幾個侷限的地方:
- 1, 每次不能超過 20 張圖片,因為 tinypng 是一個 web 網站,一次上傳太多勢必影響
速度和伺服器壓力; - 2,不能控制壓縮比例,這一點 compressjpeg.com 做的很好,可以對每一張圖片進行控制
- 3,寫文章的時候我 markdown 用得非常多,所以我希望在壓縮的時候順便上傳到圖床。
所以希望自己能做一款簡單好用的圖片工具,順便定製一些自己常用的功能。
初步設想
我的初步設想是這樣的:
1, 先通過命令列的形式來使用,非常方便,後面如果有需求再寫介面。
picom 圖片名稱.jpg
這條命令可以對圖片進行智慧壓縮。格式為原來的格式,生成的新圖片名字為
圖片名稱_picom.jpg
2,指定新檔名
picom name.jpg -o new_name.png
圖片的格式也將根據新的檔名稱跟著變化
3,只指定格式
picom name.jpg --format png
圖片指定為新的格式,但是檔名還是預設的。
4,裁剪大小
picom name.jpg --size normal
圖片將被裁剪成正常大小,可以設定幾檔常用的
5,裁剪指定具體大小
picom name.jpg --size 920*520
6, 上傳到圖床
picom name.jpg --upload
上傳到圖床以後,返回圖床地址。圖床的地址用什麼形式儲存還在思考。
可能涉及的知識和庫
- click 命令列工具
- subprocess 子程式管理工具
- pillow 庫使用
- pngquant (一個png圖片有失真壓縮)
- mozjpeg
- optipng (png 無失真壓縮)
- python 如何呼叫 c 程式碼
- requests 庫和 aiohttp / aiofile 庫的使用
嘗試使用 pillow 庫進行圖片壓縮
pillow 是 python 處理圖片的一個非常厲害的庫 , 帶有圖片壓縮的功能。
我先後嘗試使用 pillow 的以下 API 對圖片進行壓縮,得到的結果不是很好。
- save(quality=50)
- save(optimize=True)
- quantize()
- convert(“RGB”)
1,quality 引數
save 方法當中的 quality 引數只適合用在 jpg 格式上,通常 80 左右的質量不會有明顯的感覺。 用在 png 格式上無效,但是也不報錯。
2,optimize 引數
optimize 引數直接壓縮沒有明顯效果。
3,quantize 方法
quantize 是主要用到的壓縮優化函式,在 png 格式壓縮上,能減少 70% 左右的空間,但是顏色差異明顯。
這是壓縮後效果對比:
4, convert 方法
通過把 png的RGBA 格式轉化成 RGB 格式,可以減少大約 20% 的大小
5,PNG 以 jpg 格式儲存
先通過 convert 方法轉成 RGB 格式,然後另存為 jpg 格式,圖片效果沒有明顯減弱,但是大小迅速減少。
結論
pillow 目前不太適合做 PNG 圖片壓縮處理,jpg 可以作為備選。 pillow 的主要應用場景可以用在灰度轉化,尺寸控制方面,這些功能等把核心的壓縮問題解決以後再加。