Java ImageIO圖像合并效率測試
通過純Java的方式往一張底圖(地圖)上添加小圖片(布點),發(fā)現(xiàn)效果并不理想。
何為純java方式?就是說這些操作不需要依賴于c/c++庫,具有良好的跨平臺性,要求不僅僅能運行在Windows、Linux、Unix三大平臺之上,也可以用作Android等移動平臺之上。
下面是往一張底圖上添加小圖片(即圖像合并)的測試的數(shù)據(jù):
合并小圖數(shù)量 |
測試次數(shù) |
100(張) |
1000(張) |
10000(張) |
耗時(毫秒) |
第1次 |
2003 |
15334 |
153010 |
第2次 |
1792 |
15200 |
153340 |
|
第3次 |
1869 |
15236 |
152673 |
|
第4次 |
1747 |
15903 |
154978 |
|
第5次 |
1871 |
16028 |
156506 |
|
第6次 |
1793 |
15545 |
154854 |
|
平均耗時(毫秒) |
|
1845.833 |
15541 |
154226.8 |
換算為秒 |
|
1.845833 |
15.541 |
154.2268 |
往一張底圖上合并小圖100張平均耗時 1.845833秒,
往一張底圖上合并小圖1000張平均耗時 15.541秒,
往一張底圖上合并小圖10000張平均耗時 154.2268秒。
感覺這樣的效率還是太低了,無法滿足數(shù)以萬計的底圖布點需求。據(jù)說,一段高效的c++程序完成數(shù)以萬計的地圖布點任務也就需要大概一兩秒的時間(聽一位頗有經(jīng)驗的高手說的,本人未曾嘗試)。
這次終于感受到java和c/c++在效率上的差距了!
那么是不是要犧牲跨平臺性了,用Jmagick嘗試一下?此問題有待討論…
Jmagick嘗試圖像合并,利用了ImageMagick的命令來調(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坐標處,輸出為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)用合并圖像方法所在的類
- 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();
- }
- }
以下是測試的數(shù)據(jù):
圖像數(shù)量 合并耗費時間(ms)
1 ---- 140
10 ---- 1419
100 ---- 13912
1000 ---- 137965
10000 ---- 1392095
二者對比,發(fā)現(xiàn)以ImageMigick命令合并圖像的方式,效率明顯低于JDK 的ImageIO處理方式,并且在跨平臺上也遜色于純java的方式。
原文鏈接:http://blog.csdn.net/hu_shengyang/article/details/7317510
【編輯推薦】