`
Java_Fan
  • 浏览: 84966 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Java ImageIO图像合并效率测试

 
阅读更多

通过纯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中的多媒体处理库。在这个项目中...

    用java把2个tiff或图片合并成一个tiff或图片

    在Java编程环境中,将两个TIFF(Tagged Image File Format)图像或普通图像合并成一个单一的TIFF或图像文件,需要对图像处理有深入的理解,特别是关于图像格式、颜色模型以及位深度的知识。以下是一些相关的技术要点...

    java合并图像集合

    ### Java合并图像集合 在Java编程语言中,处理图像的操作是一项常见的需求,特别是在涉及图形界面的应用程序中。本文将深入探讨如何使用Java合并图像,并基于提供的代码片段进行详细解析。 #### 1. 导入必要的类库...

    java合并图片学习

    在Java编程语言中,合并...总之,Java通过`java.awt`和`javax.imageio`提供了强大的图像处理能力,使得在程序中合并图片成为可能。通过`ImageTest.java`这样的源码,我们可以学习到如何利用这些工具来实现具体的功能。

    java 操作图片,往图片写字,将多图片合并

    除了往图片上添加文字外,另一个常见的需求就是将多张图片合并成一张。虽然原始代码没有提供合并图片的具体实现,但这里可以提供一种通用的合并策略: #### 合并图片的方法 1. **确定最终图片的尺寸**:首先计算出...

    Java将多张图片合成为一张图像.rar

    Java将多张图片合成为一张,类似于PhotoShop中的合成图片,将两张图片合成输出为一张JPG,两幅图像叠加在一起,这是个比较基础的Java图像合成的例子。在JAVA中实现图片合成,本例的实现核心代码如下:  InputStream...

    java poi 填充word(合并单元格,添加图片,设置字号)(csdn)————程序.pdf

    在本示例中,我们看到如何使用Java POI来填充Word文档,包括合并单元格、添加图片以及设置字号。以下是对代码的详细解释: 1. **初始化Document对象**: 首先,`Document`类是Apache POI库中的核心类,用于表示...

    利用Java程序把多张图片合成一张图片

    在Java编程语言中,将多张图片合成一张图片是一项常见的图像处理任务,广泛应用于各种应用场景,如社交媒体拼图、报告生成、数据可视化等。要实现这个功能,我们需要使用到Java的图像处理库,如Java AWT(Abstract ...

    java程序把两张图片合成在一起

    这个过程涉及到对图像文件的读取、处理以及合并,通常使用Java的内置库如`java.io`和`javax.imageio`。在这个场景中,`FileInputStream`用于读取图片文件,而`FileOutputStream`则用于将合成后的图片写入到新的文件...

    多张图片合并

    "多张图片合并"这个主题就是关于如何将多个图像整合到一张图片中的技术。这通常涉及到编程和图像处理库的使用,例如Java中的Java Advanced Imaging (JAI) 或者更流行的ImageIO API。 描述中提到的“图片路径数量...

    java合并图片,插入文字以及二维码的工具

    1. **图片合并**:在Java中,可以使用Java的`java.awt`和`javax.imageio`包来处理图像。通过`BufferedImage`类,我们可以加载多张图片,然后将它们按照特定的布局和位置合并到一张新的图片中。这个过程可能涉及到...

    java处理图片大小等比例缩放,自定义修改图片大小,截取,水印

    Java的`ImageIO.write()`方法可用于保存图片,通过设置JPEG或PNG格式的压缩质量来控制大小: ```java File output = new File("output.jpg"); ImageIO.write(resized, "JPEG", output); // 设置JPEG质量,范围0...

    java给图片添加水印

    在Java编程语言中,给图片添加水印是一项常见的任务,特别是在网站开发中,为了保护版权或者标识来源,经常需要在用户上传的图片上添加特定的文字或图像水印。以下将详细讲解如何使用Java来实现这一功能。 首先,...

    java 实现 JPG图像文件转换TIFF文件 有源码。有工程

    4. **TIFF图片合并**:如果需要将多个TIFF图像合并成一个文件,可以使用`ImageReader`和`ImageTranscoder`来读取源图像,然后使用`ImageWriter`将它们写入一个新的TIFF文件。需要注意的是,TIFF文件支持多页,所以...

    Java图像处理代码

    这个压缩包包含了一系列实用的Java代码示例,涵盖了多个图像处理的关键功能,如半透明处理、图像合并、缩放、生成缩略图以及暗化图像。下面我们将深入探讨这些知识点。 1. **图像半透明处理**: 在Java中,可以...

    Java图像处理源码

    在Java编程语言中,图像处理是一项重要的任务,尤其在创建应用程序、游戏或Web服务时,可能需要对图像进行各种操作,如转换、编辑、合并或添加水印。本压缩包包含的源码专注于处理TIFF(Tagged Image File Format)...

    java实现合并图片的方法示例

    在Java编程中,合并图片是一项常见的任务,尤其在图像处理或图形用户界面开发中。本篇文章将详细解析如何使用Java实现合并两张图片的功能。通过一个具体的示例代码,我们将了解到如何读取、处理和合并图片的基本步骤...

    通过BufferedImage实现将几张图片合成一张图片,图片效果类型为依次排列图片

    接下来,我们可以创建一个方法,接收四张图片的路径作为参数,然后将这些图片合并成一张新的图片。这个方法分为以下几个步骤: 1. **读取图片**:使用`ImageIO.read()`方法读取每一张图片到`BufferedImage`对象中。...

    用JAVA获取视频文件中的帧图片并等比缩放

    * 在视频文件中的帧图片获取后,我们可以使用ImageIO类来对图片进行等比缩放。 * 等比缩放可以应用于不同的应用场景,例如视频封面、图片分享、多媒体处理等。 知识点三:javacv库 * javacv库是一个基于Java的...

    java实现飞机大战图片素材.rar

    5. **精灵(Sprite)和精灵表(SpriteSheet)**:在游戏开发中,多个相关的图像可能会被合并到一张大的图片(精灵表)中,以便更有效地加载和管理。通过切片精灵表,我们可以获取单个图像。这通常需要用到坐标计算和`...

Global site tag (gtag.js) - Google Analytics