㈠ graphicsmagick在java中怎麼使用
伺服器端圖片上傳邏輯改版,將文件自己壓縮成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用戶的可讀寫許可權內的路徑,換成當前身份可讀寫的路徑唄或者換登入身份唄~
最後測試,發現性能相當優異!