做網(wǎng)站往往需要處理各種各樣的圖片,對(duì)于jdk自帶的一套圖片處理庫(kù),他的特點(diǎn)是穩(wěn)定簡(jiǎn)單,但是對(duì)圖片處理來(lái)說(shuō),性能確實(shí)很不咋的!
??? ??? 于是我轉(zhuǎn)向了以C++處理為核心的java處理包—— JMagick+ ImageMagick 。jmagick是一個(gè)開(kāi)源的API,利用JNI(Java Native Interface)技術(shù)實(shí)現(xiàn)了對(duì)ImageMagickAPI 的Java訪問(wèn)接口,因此也將比純Java實(shí)現(xiàn)的圖片操作函數(shù)在速度上要快。實(shí)地測(cè)試后發(fā)現(xiàn),速度果然提高了不少,但是質(zhì)量卻大大下降了,在大量測(cè)試數(shù)據(jù) 下,每生成100張圖片約會(huì)有5張圖片生成出現(xiàn)錯(cuò)誤,還會(huì)出現(xiàn)down機(jī)的情況。對(duì)于一個(gè)商業(yè)應(yīng)用來(lái)說(shuō),這個(gè)是絕對(duì)不可以接受的,于是對(duì)jmagick的 研究暫放一段時(shí)間。
??? ??? 經(jīng)過(guò)韓boss指導(dǎo),我轉(zhuǎn)向了 GraphicsMagick+im4java 的研究,輸入關(guān)鍵詞google一下,很容易就可以找到
http://javantsky.iteye.com/blog/747807
,這篇博客,文章介紹GraphicsMagick+im4java 性能高,運(yùn)行穩(wěn)定!
??? ??? 于是我開(kāi)始了對(duì)GraphicsMagick+im4java實(shí)際研究:
??? ??? 個(gè)人感覺(jué)im4java就是graphicsmagick的外面包裝了一層“紙”,一個(gè)java轉(zhuǎn)換的命令行輸出工具,其api也基本沒(méi)有參考價(jià)值(有些 與實(shí)際不符的地方),GraphicsMagick+im4java的核心在于GraphicsMagick。
??? ??? 作為一個(gè)縮放+切割功能的實(shí)現(xiàn),可以使用
- gm?convert?input.jpg?-thumbnail?100x100^?-gravity?center?-extent?100x100?output.jpg??
gm convert input.jpg -thumbnail 100x100^ -gravity center -extent 100x100 output.jpg
???? ??? 這條命令,經(jīng)過(guò)測(cè)試發(fā)現(xiàn),thumbnail命令的效率還不如原有java實(shí)現(xiàn)的效率,可能用它來(lái)實(shí)現(xiàn)這么簡(jiǎn)單的功能是高射炮打蚊子了,關(guān)于GraphicsMagick各項(xiàng)參數(shù)的使用的文章,網(wǎng)上實(shí)在是少之又少,于是只能靠自己了!
??????? 我找到了所有和縮放有關(guān)的命令,經(jīng)過(guò)一一驗(yàn)證,最終選擇了sample命令。相比最初的純java實(shí)現(xiàn),內(nèi)存節(jié)省了約70%,CPU效率提高了約80%, 耗費(fèi)時(shí)間約節(jié)省了72%,下面為我找到的所有縮放有關(guān)的GraphicsMagick命令的測(cè)試數(shù)據(jù):
Graphics+im4java性能對(duì)比:
??? ??? 記錄一(其中內(nèi)存和CPU為觀測(cè)數(shù)據(jù)):
??? ??? 原有java實(shí)現(xiàn):
??? ??? ??? 圖片大小:2.5M(2592x1944)
??? ??? ??? 內(nèi)存:1185M(共)
??? ??? ??? CPU:170%(共)(按雙核)
??? ??? ??? 耗時(shí):162,875ms/200張(線程池10)
??? ??? ??? 輸出圖片大小:36.1K
??? ??? thumbnail命令實(shí)現(xiàn):
- gm?convert?input.jpg?-thumbnail?600x600^?-gravity?center?-extent?600x600?output.jpg??
gm convert input.jpg -thumbnail 600x600^ -gravity center -extent 600x600 output.jpg
??? ??? ??? 圖片大?。?.5M(2592x1944)
??? ??? ??? 內(nèi)存:150M/線程
??? ??? ??? CPU:9%/線程
??? ??? ??? 耗時(shí):193,423ms/200張(線程池10)
??? ??? ??? 輸出圖片大?。?8.5K
??? ??? geometry命令實(shí)現(xiàn):
- gm?convert?input.jpg?-geometry?600x600^?-gravity?center?-extent?600x600?output.jpg??
gm convert input.jpg -geometry 600x600^ -gravity center -extent 600x600 output.jpg
??? ??? ??? 圖片大小:2.5M(2592x1944)
??? ??? ??? 內(nèi)存:50M/線程
??? ??? ??? CPU:9%/線程
??? ??? ??? 耗時(shí):94,518ms/200張(線程池10)
??? ??? ??? 輸出圖片大小:101.8K
??? ??? resize命令實(shí)現(xiàn):
- gm?convert?input.jpg?-resize?600x600^?-gravity?center?-extent?600x600?output.jpg??
gm convert input.jpg -resize 600x600^ -gravity center -extent 600x600 output.jpg
? ??? ??? ??? 圖片大?。?.5M(2592x1944)
??? ??? ??? 內(nèi)存:55M/線程
??? ??? ??? CPU:13%/線程
??? ??? ??? 耗時(shí):97,342ms/200張(線程池10)
??? ??? ??? 輸出圖片大?。?01.8K
??? ??? sample命令實(shí)現(xiàn):
- gm?convert?input.jpg?-sample?600x600^?-gravity?center?-extent?600x600?output.jpg??
gm convert input.jpg -sample 600x600^ -gravity center -extent 600x600 output.jpg
? ??? ??? ??? 圖片大小:2.5M(2592x1944)
??? ??? ??? 內(nèi)存:35M/線程
??? ??? ??? CPU:9%/線程
??? ??? ??? 耗時(shí):46,541ms/200張(線程池10)
??? ??? ??? 輸出圖片大小:117.3K
??? ??? sample(quality:50)
- gm?convert?input.jpg?-sample?600x600^?-gravity?center?-extent?600x600?-quality? 50 ?output.jpg??
gm convert input.jpg -sample 600x600^ -gravity center -extent 600x600 -quality 50 output.jpg
??? ??? ??? 圖片大小:2.5M(2592x1944)
??? ??? ??? 內(nèi)存:40M/線程
??? ??? ??? CPU:16%/線程
??? ??? ??? 耗時(shí):68,839ms/200張(線程池10)
??? ??? ??? 輸出圖片大?。?7.2
??? ??? scale命令實(shí)現(xiàn):
- gm?convert?input.jpg?-scale?600x600^?-gravity?center?-extent?600x600?output.jpg??
gm convert input.jpg -scale 600x600^ -gravity center -extent 600x600 output.jpg
? ??? ??? ??? 圖片大?。?.5M(2592x1944)
??? ??? ??? 內(nèi)存:42M/線程
??? ??? ??? CPU:8%/線程
??? ??? ??? 耗時(shí):68,778ms/200張(線程池10)
??? ??? ??? 輸出圖片大?。?9.2K
??? ??? 在sample命令下,可以通過(guò)修改quality參數(shù)的值,來(lái)修改輸出圖片質(zhì)量,改變輸出圖片大小。以下為我的測(cè)試數(shù)據(jù):
??? ??? 記錄二:
??? ??? ??? sample對(duì)比(無(wú)quality設(shè)置):
??? ??? ??? 圖片大?。?.5M(2592x1944)
??? ??? ??? 內(nèi)存:32(\)M/線程
??? ??? ??? CPU:9%/線程
??? ??? ??? 耗時(shí):46,659ms/200張(線程池10)
??? ??? ??? 輸出圖片大?。?17.3K
??? ??? ??? sample(quality:50)
??? ??? ??? 圖片大?。?.5M(2592x1944)
??? ??? ??? 內(nèi)存:28M/線程
??? ??? ??? CPU:9%/線程
??? ??? ??? 耗時(shí):40,549ms/200張(線程池10)
??? ??? ??? 輸出圖片大?。?8.8
??? ??? ??? sample(quality:60)
??? ??? ??? 圖片大小:2.5M(2592x1944)
??? ??? ??? 內(nèi)存:35M(\)/線程
??? ??? ??? CPU:8%(\)/線程
??? ??? ??? 耗時(shí):45,647ms/200張(線程池10)
??? ??? ??? 輸出圖片大?。?3.3
??? ??? ??? sample(quality:75)
??? ??? ??? 圖片大?。?.5M(2592x1944)
??? ??? ??? 內(nèi)存:30M(\)/線程
??? ??? ??? CPU:9%(\)/線程
??? ??? ??? 耗時(shí):45,719ms/200張(線程池10)
??? ??? ??? 輸出圖片大小:65.6
??? ??? ??? sample(quality:85)
??? ??? ??? 圖片大?。?.5M(2592x1944)
??? ??? ??? 內(nèi)存:32M(\)/線程
??? ??? ??? CPU:8%(\)/線程
??? ??? ??? 耗時(shí):46,510ms/200張(線程池10)
??? ??? ??? 輸出圖片大小:84.5
??? ??? ??? sample(quality:95)
??? ??? ??? 圖片大小:2.5M(2592x1944)
??? ??? ??? 內(nèi)存:34M(\)/線程
??? ??? ??? CPU:8%(\)/線程
??? ??? ??? 耗時(shí):47,650ms/200張(線程池10)
??? ??? ??? 輸出圖片大小:156.0
??? ??? ??? sample(quality:100)
??? ??? ??? 圖片大?。?.5M(2592x1944)
??? ??? ??? 內(nèi)存:34M(\)/線程
??? ??? ??? CPU:11%(\)/線程
??? ??? ??? 耗時(shí):50,469ms/200張(線程池10)
??? ??? ??? 輸出圖片大?。?98.1
- ConvertCmd?cvcmd?=?new?ConvertCmd();??
- Operation?op?=?new?Operation();??
- op.addImage();??
- op.addRawArgs( "-sample" ,? "600x600^" );??
- op.addRawArgs( "-gravity" ,? "center" );??
- op.addRawArgs( "-extent" ,? "600x600" );??
- op.addRawArgs( "-quality" ,? "100" );??
- op.addImage();??
- ??
- cvcmd.run(op,?srcImg,?desImg);??
ConvertCmd cvcmd = new ConvertCmd(); Operation op = new Operation(); op.addImage(); op.addRawArgs("-sample", "600x600^"); op.addRawArgs("-gravity", "center"); op.addRawArgs("-extent", "600x600"); op.addRawArgs("-quality", "100"); op.addImage(); cvcmd.run(op, srcImg, desImg);
? ? ? ? 這是我從文小貓童鞋那里找到的一張她自制的美食圖片,源圖像文件像素為1944x2592,處理后為600x600;
??????? 由于個(gè)人能力有限,歡迎大家指出不足,提出更好的解決方案!
???????
??? ??? im4java官方網(wǎng)站:
??? ???
http://im4java.sourceforge.net/index.html
??? ??? im4java的api:
??? ???
http://im4java.sourceforge.net/api/
??? ??? graphicsmagick的官方網(wǎng)站:
??? ???
http://www.graphicsmagick.org/index.html
??? ??? graphicsmagick的命令行參數(shù)解析:
??? ???
http://www.graphicsmagick.org/utilities.html
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
