使用pngquant工具對PNG格式圖片進行壓縮

不少網站都對上傳圖片的大小有限制。如開源中國的博客限制圖片大小在200KB之內。可是圖片的大小很容易超過200KB,這就須要讓咱們想辦法壓縮下圖片的空間。算法

這幾天我拍攝了不少花草樹木主題的照片,我用的手機型號是華爲榮耀7。shell

以一張手機拍攝的照片爲例, 照片具備以下參數:windows

名稱:IMG_20160716_135420
型號:PLK-AL10
大小:5.86MB
寬度:2896
高度:5152
曝光:1/33s
ISO:200
光圈:2.0
焦距:27mm(等效35mm膠片焦距)
白平衡:自動
閃光燈:未使用閃光燈
路徑:/storage/emulated/0/DCIM/Camera/IMG_20160716_135420.jpg

打開手機版QQ(Android,V6.5.0.2835)按原圖的形式將圖片發送到電腦端的QQ(QQ7.4(15203))。電腦端QQ接收到相片後,將相片另存爲成jpg文件,寬度和高度都沒有變,仍是2896x5152,大小變爲2.21MB。api

若是用畫圖工具(mspaint.exe,版本6.1,內部版本7601: Service Pack 1)打開此程序,並進行另存爲。mspaint一共能夠將圖片保存爲八種格式,包括:bash

一、單色位圖(擴展名bmp),1832KB,將原圖轉換爲黑白圖片服務器

二、16色位圖(擴展名bmp),7286KB,壓縮幅度較大,顏色嚴重失真app

三、256色位圖(擴展名bmp),14582KB,壓縮幅度較大,顏色嚴重失真less

四、24位位圖(擴展名bmp),43712KBide

五、GIF圖像(擴展名gif),6413KB工具

六、JPEG圖像(擴展名jpg),3702KB

七、PNG圖像(png格式),27353KB

八、TIFF圖像(tif格式),19745KB

可見,mspaint保存爲各類格式,圖片的大小都不會過小,由於mspaint並無改變圖像的尺寸。

若是想縮減圖像的大小,還有一個簡單的辦法,就是用QQ截圖把從手機端發來圖像,點開後再截一遍。QQ截圖支持保存四種圖像類型:

一、BMP格式,大小510KB

二、JPEG格式,大小822KB

三、PNG格式,大小365KB

四、GIF格式,大小113KB

(由於是用鼠標截的,圖片的尺寸長寬有±2的偏差,約在387x706)

從上面的數據能夠看到,QQ截圖對圖像進行了壓縮,效果已經很是明顯,由於QQ截圖計算的圖像大小是按用戶截圖時截到的像素數計算的。不過不少圖片咱們在上傳時只須要讓它按正常大小顯示時清晰就能夠了,看圖片的人也不須要對其進行放大等操做以便更細緻的觀察,因此用QQ截圖從新截取圖片並另存爲PNG格式也不失爲給圖片「減肥」的方法之一。GIF格式的壓縮效果是最明顯的,不過另存爲這種格式的圖片看上去效果並很差,我用Firefox打開了這個GIF文件看了下,部分顏色出現了嚴重的失真。

爲了進一步對圖像進行使人滿意的壓縮,我發現了一個工具,名叫pngquant

下載地址:https://pngquant.org/

根據該工具官方介紹,該工具備如下四點特性(下方括號內爲個人翻譯):

一、High-quality palette generation using a combination of vector quantization algorithms.

(使用一組矢量量化算法制做的高質量調色盤生成器)

二、Unique adaptive dithering algorithm that adds less noise to images than the standard Floyd-Steinberg.

(獨特的自適應抖動算法,較標準的佛洛依德-斯坦伯格方法噪點更少)

三、Easy to integrate with shell scripts, GUIs and server-side software.

(易於集成到Shell腳本、GUI界面和其餘服務器端軟件)

四、Fast mode for processing large numbers of images.

(對大量圖像採起快速模式處理)

咱們直接從官方網站下載最新版本的pngquant便可,2016年7月17日可下載到的最新版本是2.7.2。

下載下來的一個zip壓縮包:pngquant-windows.zip

解壓縮此壓縮包後,能夠看到文件列表以下:

pngquant.exe就是咱們要用到的命令行工具,用cmd執行此程序(不帶參數)時會有以下說明信息:

E:\pngquant>pngquant.exe
pngquant, 2.7.2 (June 2016), by Kornel Lesinski, Greg Roelofs.
   SSE acceleration disabled.
   Compiled with OpenMP (multicore support).
   Compiled with no support for color profiles. Using libpng 1.6.23.

usage:  pngquant [options] [ncolors] -- pngfile [pngfile ...]
        pngquant [options] [ncolors] - >stdout <stdin

options:
  --force           overwrite existing output files (synonym: -f)
  --skip-if-larger  only save converted files if they're smaller than original
  --output file     destination file path to use instead of --ext (synonym: -o)
  --ext new.png     set custom suffix/extension for output filenames
  --quality min-max don't save below min, use fewer colors below max (0-100)
  --speed N         speed/quality trade-off. 1=slow, 3=default, 11=fast & rough
  --nofs            disable Floyd-Steinberg dithering
  --posterize N     output lower-precision color (e.g. for ARGB4444 output)
  --verbose         print status messages (synonym: -v)

Quantizes one or more 32-bit RGBA PNGs to 8-bit (or smaller) RGBA-palette.
The output filename is the same as the input name except that
it ends in "-fs8.png", "-or8.png" or your custom extension (unless the
input is stdin, in which case the quantized image will go to stdout).
The default behavior if the output file exists is to skip the conversion;
use --force to overwrite. See man page for full list of options.

E:\pngquant>

這裏面詳細說明了pngquant工具的各命令行參數,不過咱們能夠先學着使用這個工具最簡單的功能,把咱們以前的那張2.21MB的JPEG圖像翻出來,用QQ截圖從新截一下,保存成PNG格式(380KB),再輸入以下命令使用pngquant進行處理:

Microsoft Windows [版本 6.1.7601]
版權全部 (c) 2009 Microsoft Corporation。保留全部權利。

C:\Users\Tsybius>e:

E:\>cd pngquant

E:\pngquant>pngquant.exe --force --verbose C:\Users\Tsybius\Desktop\test_pic.png

C:\Users\Tsybius\Desktop\test_pic.png:
  read 381KB file
  made histogram...51684 colors found
  selecting colors...3%
  selecting colors...6%
  selecting colors...10%
  selecting colors...31%
  selecting colors...51%
  selecting colors...55%
  selecting colors...75%
  selecting colors...79%
  selecting colors...82%
  selecting colors...100%
  moving colormap towards local minimum
  eliminated opaque tRNS-chunk entries...0 entries transparent
  mapped image to new colors...MSE=1.867 (Q=93)
  writing 256-color image as C:\Users\Tsybius\Desktop\test_pic-fs8.png
No errors detected while quantizing 1 image.

E:\pngquant>

命令執行完畢後,生成了圖像test_pic-fs8.png,這個圖像只有175KB。哈哈,開源中國的博客只能上傳200KB如下的圖片,因此這張本來很大的照片就能夠上傳上來了,這張照片拍的是在北京南禮士路行道樹上週氏齧小蜂的孕蜂蛹(難怪月壇這片兒找不到蝴蝶,哼哼)。

其實,pngquant工具自帶的兩個bat批處理文件,已經能傻瓜式的解決大部分的圖片轉換問題了。

一、Drag PNG here to reduce palette automatically.bat

@echo off

set path=%~d0%~p0

:start

"%path%pngquant.exe" --force --verbose --quality=45-85 %1
"%path%pngquant.exe" --force --verbose --ordered --speed=1 --quality=50-90 %1

shift
if NOT x%1==x goto start

二、Drag PNG here to reduce palette to 256.bat

@echo off

set path=%~d0%~p0

:start

"%path%pngquant.exe" --force --verbose 256 %1

shift
if NOT x%1==x goto start

直接將要轉換的png圖片拖到這兩個批處理文件上,該png圖片就能夠做爲批處理文件的命令行參數傳入,pngquant工具將會自動將png圖片進行壓縮。

最後再提一個工具:PNGoo,這個工具爲pngquant添加了一個GUI界面

下載地址:https://pngquant.org/PNGoo.0.1.1.zip

或是:https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pngoo/PNGoo0.1.0.zip

抱着試試看的心態,我從第一個地址下載了此工具,發現它的libs\pngquanti目錄中自帶了pngquant工具(pngquanti.exe),此pngquant工具的版本爲1.8.1(第二個地址我沒下載成功,不過上傳時間記錄的是Jul 7, 2009,也算是個七年前的老古董了)。

該程序使用方法也很簡單,步驟以下:

一、點擊「Add」按鈕新增圖片到列表

二、在Output區域設定輸出文件到原PNG同一目錄或是指定目錄

三、在CompressionOption區域設定輸出PNG文件的一些參數,點擊Colour按鈕後進入界面以下圖所示:

四、最後點擊「Go!」按鈕生成圖片,生成後圖片的Status會變爲「Complete: PNGQuant used」

總結一下,其實工具PNGoo的目的就是爲了方便人使用pngquant工具,但一來pngquant工具其實熟悉了命令行參數後並不難使用,二來PNGoo對應的pngquant工具已經落後於如今2.7.2不少個版本,因此這裏仍是建議直接經過命令行或本身寫個bat/shell腳原本使用pngquant工具。

END

相關文章
相關標籤/搜索