您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何進(jìn)行Java ImageIO圖像合并效率測(cè)試,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
通過(guò)純Java的方式往一張底圖(地圖)上添加小圖片(布點(diǎn)),發(fā)現(xiàn)效果并不理想。
何為純java方式?就是說(shuō)這些操作不需要依賴(lài)于c/c++庫(kù),具有良好的跨平臺(tái)性,要求不僅僅能運(yùn)行在Windows、Linux、Unix三大平臺(tái)之上,也可以用作Android等移動(dòng)平臺(tái)之上。
下面是往一張底圖上添加小圖片(即圖像合并)的測(cè)試的數(shù)據(jù):
合并小圖數(shù)量 | 測(cè)試次數(shù) | 100(張) | 1000(張) | 10000(張) |
耗時(shí)(毫秒) | 第1次 | 2003 | 15334 | 153010 |
第2次 | 1792 | 15200 | 153340 | |
第3次 | 1869 | 15236 | 152673 | |
第4次 | 1747 | 15903 | 154978 | |
第5次 | 1871 | 16028 | 156506 | |
第6次 | 1793 | 15545 | 154854 | |
平均耗時(shí)(毫秒) | 1845.833 | 15541 | 154226.8 | |
換算為秒 | 1.845833 | 15.541 | 154.2268 |
往一張底圖上合并小圖100張平均耗時(shí) 1.845833秒,
往一張底圖上合并小圖1000張平均耗時(shí) 15.541秒,
往一張底圖上合并小圖10000張平均耗時(shí) 154.2268秒。
感覺(jué)這樣的效率還是太低了,無(wú)法滿(mǎn)足數(shù)以萬(wàn)計(jì)的底圖布點(diǎn)需求。據(jù)說(shuō),一段高效的c++程序完成數(shù)以萬(wàn)計(jì)的地圖布點(diǎn)任務(wù)也就需要大概一兩秒的時(shí)間(聽(tīng)一位頗有經(jīng)驗(yàn)的高手說(shuō)的,本人未曾嘗試)。
這次終于感受到j(luò)ava和c/c++在效率上的差距了!
那么是不是要犧牲跨平臺(tái)性了,用Jmagick嘗試一下?此問(wèn)題有待討論…
Jmagick嘗試圖像合并,利用了ImageMagick的命令來(lái)調(diào)用命令合并圖像的方式
<span style="white-space:pre"> </span>public void compositeImageList(List additionImageList,String srcImagePath,String toImagePath){ /* *命令格式:composite -geometry +100+150 additionImagePath srcImagePath toImagePath *將圖像additionImagePath附加在圖像srcImagePath上的100,150坐標(biāo)處,輸出為toImagePath圖像 */ //String command = "composite -geometry +100+150 D:/test/fileSource/007.png D:/test/fileSource/002.jpg D:/test/desk/rose-002.png"; if(additionImageList!=null){ System.out.println(additionImageList.size()); for(int i=0;i<additionImageList.size();i++){ String[] additionImageInfo = (String[]) additionImageList.get(i); int x = Integer.parseInt(additionImageInfo[0]); int y = Integer.parseInt(additionImageInfo[1]); String additionImagePath = additionImageInfo[2]; StringBuffer command = new StringBuffer(""); command.append("composite -geometry "); command.append("+"+x+"+"+y+" "); command.append(additionImagePath+" "); command.append(srcImagePath+" "); command.append(toImagePath); System.out.println(command); String[] str = {command.toString()}; JmagickTest.exec(str); } } }
public static void main(String[] args) { JmagickTest obj = new JmagickTest();//調(diào)用合并圖像方法所在的類(lèi) try { String additionImagePath = "D:/test/fileSource/007.png"; List additionImageList = new ArrayList(); for(int i = 0;i<100;i++){ Random random = new Random(); int x = random.nextInt(760); int y = random.nextInt(1020); String[] additionImageInfo = {x+"",y+"",additionImagePath}; additionImageList.add(additionImageInfo); } String srcImagePath = "D:/test/fileSource/004.jpg"; String toImagePath = "D:/test/fileSource/004.jpg"; long start = System.currentTimeMillis(); obj.compositeImageList(additionImageList, srcImagePath, toImagePath); long end = System.currentTimeMillis(); System.out.println(end - start); } catch (Exception e) { e.printStackTrace(); } }
以下是測(cè)試的數(shù)據(jù):
圖像數(shù)量 合并耗費(fèi)時(shí)間(ms)
1 ---- 140
10 ---- 1419
100 ---- 13912
1000 ---- 137965
10000 ---- 1392095
二者對(duì)比,發(fā)現(xiàn)以ImageMigick命令合并圖像的方式,效率明顯低于JDK 的ImageIO處理方式,并且在跨平臺(tái)上也遜色于純java的方式。
關(guān)于如何進(jìn)行Java ImageIO圖像合并效率測(cè)試就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。