pngquant的官網上有提供圖形化GUI的工具及命令列的Command-Line工具,如果要用程式碼的使用方式的話,可以點 "a library" 連結到它的 lib 網站 (libimagequant),在lib網站中,可以看到許多不同語言的使用方式。
我的環境是Windows 7,jdk1.5.0_15,必須製作相應libimagequant專案的dll檔。
制作dll檔有許多方式,libimagequant官網給Windows的建議為使用Viusal Studio或MinGW工具來產生dll,我選擇最簡單的方式,去Microsoft官網下載安裝Visual Studio 2015來用。
點擊 "MSVC-compatible branch of the library" 可連到MSVC版lib的Git網站,把整個專案下載下來後,就可以開始進行JNI的步驟。
以下是JNI的詳細步驟:
- 使用命令列視窗(cmd)到下載並已被解壓縮的libimagequant-msvc資料夾,打上以下指令來產生相應PngQuant.class、Image.class、 Result.class (Class檔請自行compile產生)的 標頭檔 (副檔名為h)
javah org.pngquant.PngQuant
javah org.pngquant.Image
javah org.pngquant.Result
產生出來的檔名會被多加一些前綴,把它們都刪掉,再把得到的pngQuant.h、Image.h、Result.h丟到org/pngquant的目錄下。 - 開啟Visual Studio 2015,New 一個 Win32 Project,Application type選 DLL ,Additional options選Empty Project就好。
- 先把org/pngquant/PngQuant.c丟到org外面那層(因為要配合裡面寫的include的path路徑),在Solution Explorer的Source File中,將全部檔(包括org資料夾之下)都Add進去(有些其實用不到,不過沒關係都先丟進去)
- 這時看PngQuant.h可能會發現有被畫紅線的Error,對專案安右鍵選擇"Properties" --> Configuration --> C/C++ 設定 Additional Include Directories ,請設定jdk中include和include/win32的位置,例如以下路徑:
C:\Program Files (x86)\Java\jdk1.5.0_15\include
C:\Program Files (x86)\Java\jdk1.5.0_15\include\win32
然後將專案的mode從debug改成release - 開啟Eclipse,建立一個測試專案,將org/pngquant下的java檔全部丟到專案中,並且再將Visual Studio release出來的dll檔丟進去。
撰寫一個測試的程式,例如叫做libimagequantTest.java,內容如下:import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.pngquant.PngQuant; public class libimagequantTest { public static void main(String[] args) { BufferedImage newImg; PngQuant pngQuant = new PngQuant(); try { newImg = pngQuant.getRemapped(ImageIO.read(new File("D:\\old_picture.png"))); ImageIO.write(newImg, "png", new File("D:\\new_picture.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } pngQuant.close(); } }
最後的檔案結構會像這樣 - 在專案上按右鍵選擇Properties --> Java Build Path 設定 Nativ Library Location,例如此例我設定的是
libimagequant_Test/src/org/pngquant - 最後放上一張檔案大小較大的圖 D:\\old_picture.png,執行libimagequantTest.java,如果有出現另一張圖D:\\new_picture.png,就代表大功告成了。
pngquant JNI_Test.7z