GraphicsMagick+IM4Java在項目中的使用總結


一)前言:
服務器端圖片上傳邏輯改版,將文件自己壓縮成3份然后上傳至某雲進行存儲。
選擇GraphicsMagick+IM4Java,放棄並發能力弱的ImageMagick+Jmagick。
網上可供學習GraphicsMagick與IM4Java的資料是在太少,翻來覆去就那么幾篇,碰到異常只能一遍又一遍的研讀官方文檔!這也是我寫這篇文章的原因之一。

im4java參考資料:

1)請詳見Developer's Guide: http://im4java.sourceforge.net/docs/dev-guide.html

2)github上im4java的源碼:https://github.com/Widen/im4java

GraphicsMagick參考資料:

1)http://www.graphicsmagick.org   

先在本地安裝使用測試,覺得性能還OK的話,再放到測試服務器上部署測試實際性能。本地環境是win,win下的GM(GraphicsMagick)就很好安裝了,與普通軟件安裝無異。

二)使用IM4Java:

瞧Developer's Guide中的“Before you begin: Setting up the Environment”內容,大意是使用之前先設置工具的工具(當然壓縮圖片的工具,名字叫gm)的搜索路徑,並說明了這幾種設置方式的差別。

比如win下的安裝路徑,假如我安裝的路徑是D:\GraphicsMagick-1.3.19-Q16,則代碼為:

String myPath="D:\\GraphicsMagick-1.3.19-Q16";

ProcessStarter.setGlobalSearchPath(myPath);   

注:我們不能在linux服務器中這么寫代碼,linux直接就設置環境變量:export PATH=$PATH:/abc...,其中/abc是你的GM工具所在路徑,比如我的是/home/db/roderickyu/soft/bin

簡單用法就直接看文檔吧,我這里寫幾個文檔里不太容易讀出來的內容:

壓縮時可以直接添加本地的圖片,比如:
IMOperation op = new IMOperation();
op.addImage("D:\\test.jpg");     // 輸入要壓縮的文件路徑
op.resize(640);                  // 多番嘗試后才知道這是限定width,height等比縮放
op.addImage("D:\\newTest.jpg");  // 壓縮后的文件的輸出路徑,當然可以沒有擴展名!

還有一種是對輸入流進行壓縮,比如官方文檔中:
IMOperation op = new IMOperation();
op.addImage("-");                   // read from stdin
op.addImage("tif:-");               // write to stdout in tif-format
代碼中tif是指按照tif格式進行壓縮,但是變化不明顯(而且壓縮后的大小與size大小不成正比),很容易給初學者造成是不是代碼不好使的挫敗感!將tif換成jpg壓縮的大小變化就明顯了。這是一個坑!

回到這個需求來,我們只有一個輸入流,怎么把這個輸入流壓縮成3份大小不等的文件呢?
將輸入流轉化成byte數組,就不存在流被第一個文件讀完第二三的文件沒有流可以讀時報異常。。。empty input file...
代碼為:
InputStream fileStream = ......
int total = fileStream.available();
byte[] bs = new byte[total];
fileStream.read(bs);

按照GM的官方文檔安裝GM時失敗,后才得解:安裝路徑不是當前linux用戶的可讀寫權限內的路徑,換成當前身份可讀寫的路徑唄或者換登入身份唄~

最后測試,發現性能相當優異!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM