通过纯Java的方式往一张底图(地图)上添加小图片(布点),发现效果并不理想。
何为纯java方式?就是说这些操作不需要依赖于c/c++库,具有良好的跨平台性,要求不仅仅能运行在Windows、Linux、Unix三大平台之上,也可以用作Android等移动平台之上。
下面是往一张底图上添加小图片(即图像合并)的测试的数据:
合并小图数量
|
测试次数
|
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秒。
感觉这样的效率还是太低了,无法满足数以万计的底图布点需求。据说,一段高效的c++程序完成数以万计的地图布点任务也就需要大概一两秒的时间(听一位颇有经验的高手说的,本人未曾尝试)。
这次终于感受到java和c/c++在效率上的差距了!
那么是不是要牺牲跨平台性了,用Jmagick尝试一下?此问题有待讨论…
--------------------------------------------Jmagick尝试图像合并,利用了ImageMagick的命令来调用命令合并图像的方式---------------------------------------------------------------
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 imageObj = new JmagickTest();//调用合并图像方法所在的类
try {
String negativeImagePath = "D:/test/fileSource/001.jpg";
String toPath = "D:/test/fileSource/001.jpg";
String additionImagePath = "D:/test/fileSource/007.png";
List additionImageList = new ArrayList();
int count = 0;
Random rand = new Random();
for(int i=0;i<10000;i++){
int x = rand.nextInt(1020);
String xStr = x+"";
int y = rand.nextInt(760);
String yStr = y +"";
String[] str = {xStr,yStr,additionImagePath};
additionImageList.add(str);
}
long start = System.currentTimeMillis();
imageObj.mergeImageList(negativeImagePath, additionImageList,"jpg", toPath);
long end = System.currentTimeMillis();
System.out.println(end-start);
} catch (Exception e) {
e.printStackTrace();
}
}
以下是测试的数据:
图像数量 合并耗费时间(ms)
1---- 140
10---- 1419
100---- 13912
1000---- 137965
10000 ---- 1392095
二者对比,发现以ImageMigick命令合并图像的方式,效率明显低于JDK 的ImageIO处理方式,并且在跨平台上也逊色于纯java的方式。
---------------------------jdk版本(jre版本)版本不同,运行效率的差异
请参考我的另一篇博文:http://blog.csdn.net/hu_shengyang/article/details/7628290
分享到:
相关推荐
在Java编程环境中,将一系列图片合并成视频是一个常见的多媒体处理任务。这个项目文件提供了一种实现方式,让我们来深入探讨一下这个过程中的关键知识点。 首先,我们要了解的是Java中的多媒体处理库。在这个项目中...
在Java编程环境中,将两个TIFF(Tagged Image File Format)图像或普通图像合并成一个单一的TIFF或图像文件,需要对图像处理有深入的理解,特别是关于图像格式、颜色模型以及位深度的知识。以下是一些相关的技术要点...
### Java合并图像集合 在Java编程语言中,处理图像的操作是一项常见的需求,特别是在涉及图形界面的应用程序中。本文将深入探讨如何使用Java合并图像,并基于提供的代码片段进行详细解析。 #### 1. 导入必要的类库...
在Java编程语言中,合并...总之,Java通过`java.awt`和`javax.imageio`提供了强大的图像处理能力,使得在程序中合并图片成为可能。通过`ImageTest.java`这样的源码,我们可以学习到如何利用这些工具来实现具体的功能。
除了往图片上添加文字外,另一个常见的需求就是将多张图片合并成一张。虽然原始代码没有提供合并图片的具体实现,但这里可以提供一种通用的合并策略: #### 合并图片的方法 1. **确定最终图片的尺寸**:首先计算出...
Java将多张图片合成为一张,类似于PhotoShop中的合成图片,将两张图片合成输出为一张JPG,两幅图像叠加在一起,这是个比较基础的Java图像合成的例子。在JAVA中实现图片合成,本例的实现核心代码如下: InputStream...
在本示例中,我们看到如何使用Java POI来填充Word文档,包括合并单元格、添加图片以及设置字号。以下是对代码的详细解释: 1. **初始化Document对象**: 首先,`Document`类是Apache POI库中的核心类,用于表示...
在Java编程语言中,将多张图片合成一张图片是一项常见的图像处理任务,广泛应用于各种应用场景,如社交媒体拼图、报告生成、数据可视化等。要实现这个功能,我们需要使用到Java的图像处理库,如Java AWT(Abstract ...
这个过程涉及到对图像文件的读取、处理以及合并,通常使用Java的内置库如`java.io`和`javax.imageio`。在这个场景中,`FileInputStream`用于读取图片文件,而`FileOutputStream`则用于将合成后的图片写入到新的文件...
"多张图片合并"这个主题就是关于如何将多个图像整合到一张图片中的技术。这通常涉及到编程和图像处理库的使用,例如Java中的Java Advanced Imaging (JAI) 或者更流行的ImageIO API。 描述中提到的“图片路径数量...
1. **图片合并**:在Java中,可以使用Java的`java.awt`和`javax.imageio`包来处理图像。通过`BufferedImage`类,我们可以加载多张图片,然后将它们按照特定的布局和位置合并到一张新的图片中。这个过程可能涉及到...
Java的`ImageIO.write()`方法可用于保存图片,通过设置JPEG或PNG格式的压缩质量来控制大小: ```java File output = new File("output.jpg"); ImageIO.write(resized, "JPEG", output); // 设置JPEG质量,范围0...
在Java编程语言中,给图片添加水印是一项常见的任务,特别是在网站开发中,为了保护版权或者标识来源,经常需要在用户上传的图片上添加特定的文字或图像水印。以下将详细讲解如何使用Java来实现这一功能。 首先,...
4. **TIFF图片合并**:如果需要将多个TIFF图像合并成一个文件,可以使用`ImageReader`和`ImageTranscoder`来读取源图像,然后使用`ImageWriter`将它们写入一个新的TIFF文件。需要注意的是,TIFF文件支持多页,所以...
这个压缩包包含了一系列实用的Java代码示例,涵盖了多个图像处理的关键功能,如半透明处理、图像合并、缩放、生成缩略图以及暗化图像。下面我们将深入探讨这些知识点。 1. **图像半透明处理**: 在Java中,可以...
在Java编程语言中,图像处理是一项重要的任务,尤其在创建应用程序、游戏或Web服务时,可能需要对图像进行各种操作,如转换、编辑、合并或添加水印。本压缩包包含的源码专注于处理TIFF(Tagged Image File Format)...
在Java编程中,合并图片是一项常见的任务,尤其在图像处理或图形用户界面开发中。本篇文章将详细解析如何使用Java实现合并两张图片的功能。通过一个具体的示例代码,我们将了解到如何读取、处理和合并图片的基本步骤...
接下来,我们可以创建一个方法,接收四张图片的路径作为参数,然后将这些图片合并成一张新的图片。这个方法分为以下几个步骤: 1. **读取图片**:使用`ImageIO.read()`方法读取每一张图片到`BufferedImage`对象中。...
* 在视频文件中的帧图片获取后,我们可以使用ImageIO类来对图片进行等比缩放。 * 等比缩放可以应用于不同的应用场景,例如视频封面、图片分享、多媒体处理等。 知识点三:javacv库 * javacv库是一个基于Java的...
5. **精灵(Sprite)和精灵表(SpriteSheet)**:在游戏开发中,多个相关的图像可能会被合并到一张大的图片(精灵表)中,以便更有效地加载和管理。通过切片精灵表,我们可以获取单个图像。这通常需要用到坐标计算和`...