2016年11月28日 星期一

如何在Java上使用 pngquant png壓縮工具 (JNI)

pngquant是一個不錯的png圖檔縮工具,但它是用C語言寫成的,如果要用Java來使用它的話,就必需使用JNI (Iava Native Interface)的方式來調用C的程式,剛好工作上需要在Java的環境上使用它,特別在這紀錄下要使用pngquant的JNI流程。

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的詳細步驟:

  1. 使用命令列視窗(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的目錄下。
  2. 開啟Visual Studio 2015,New 一個 Win32 Project,Application type選 DLL ,Additional options選Empty Project就好。
  3. 先把org/pngquant/PngQuant.c丟到org外面那層(因為要配合裡面寫的include的path路徑),在Solution Explorer的Source File中,將全部檔(包括org資料夾之下)都Add進去(有些其實用不到,不過沒關係都先丟進去)
  4. 這時看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
  5. 開啟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();
     }
    
    }
    
    最後的檔案結構會像這樣
  6. 在專案上按右鍵選擇Properties --> Java Build Path 設定 Nativ Library Location,例如此例我設定的是
    libimagequant_Test/src/org/pngquant
  7. 最後放上一張檔案大小較大的圖 D:\\old_picture.png,執行libimagequantTest.java,如果有出現另一張圖D:\\new_picture.png,就代表大功告成了。
源始碼下載:
pngquant JNI_Test.7z

沒有留言 :

張貼留言