/** * 图片拼接 * @param files 要拼接的文件列表 * @param type 1 横向拼接, 2 纵向拼接 * @return */ public static InputStream merge(String[] files, int type) { int len = files.length; if (len < 1) { log.info("图片数量小于1"); return null; } File[] src = new File[len]; BufferedImage[] images = new BufferedImage[len]; int[][] ImageArrays = new int[len][]; for (int i = 0; i < len; i++) { try { src[i] = new File(files[i]); images[i] = ImageIO.read(src[i]); } catch (Exception e) { e.printStackTrace(); return null; } int width = images[i].getWidth(); int height = images[i].getHeight(); ImageArrays[i] = new int[width * height];// 从图片中读取RGB ImageArrays[i] = images[i].getRGB(0, 0, width, height, ImageArrays[i], 0, width); } int newHeight = 0; int newWidth = 0; for (int i = 0; i < images.length; i++) { //横向 if(type == 1){ newHeight = newHeight > images[i].getHeight() ? newHeight : images[i].getHeight(); newWidth += images[i].getWidth(); }else if(type == 2){//纵向 newWidth = newWidth > images[i].getWidth() ? newWidth : images[i].getWidth(); newHeight += images[i].getHeight(); } } log.info("拼接后图像宽度:"+newWidth); log.info("拼接后图像高度:"+newHeight); if (type == 1 && newWidth < 1) { log.info("拼接后图像宽度小于1"); return null; } if (type == 2 && newHeight < 1) { log.info("拼接后图像高度小于1"); return null; } //生成新图片 try { BufferedImage ImageNew = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); int height_i = 0; int width_i = 0; for (int i = 0; i < images.length; i++) { if(type == 1){ ImageNew.setRGB(width_i, 0, images[i].getWidth(), newHeight, ImageArrays[i], 0, images[i].getWidth()); width_i += images[i].getWidth(); }else if(type == 2){ ImageNew.setRGB(0, height_i, newWidth, images[i].getHeight(), ImageArrays[i], 0, newWidth); height_i += images[i].getHeight(); } } // File outFile = new File("d://123.jpg"); // ImageIO.write(ImageNew, "jpg", outFile);// 写图片 ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(ImageNew, "jpg", out);// 图片写入到输出流中 ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); return in; } catch (Exception e) { e.printStackTrace(); return null; } }
相关推荐
总之,这个项目展示了如何在Java环境下利用JavaCV和OpenCV实现图像拼接,涉及到计算机视觉的基本概念和技术,包括图像处理、特征匹配、几何变换和图像融合。对于想深入学习图像处理和计算机视觉的开发者来说,这是一...
Java图像处理源代码是关于利用Java编程语言对图像进行各种操作和分析的程序集合。Java提供了丰富的库,如Java Advanced Imaging (JAI) 和 Java 2D API,使得开发人员能够方便地实现图像的读取、显示、编辑、转换以及...
11. **JAVA图像处理库**:如OpenCV的JAVA接口,它可以提供更高级的图像处理功能,如对象识别、人脸识别等。 在"CODE"文件夹中,你可能会找到对应的源代码示例,涵盖了上述知识点的实际应用。通过阅读和分析这些代码...
在图像处理领域,"基于SIFT的图像拼接"是一个重要的技术,用于将多张具有重叠区域的图像合并成一张全景图像。SIFT(尺度不变特征变换)是由David G. Lowe提出的,它是一种强大的特征检测和描述算法,对图像的缩放、...
基于Java Web的图像拼接系统:WebPano.pdf 本资源提供了一个基于Java Web的图像拼接系统的设计和实现,旨在解决图像拼接系统从桌面移植到网上的用户体验和服务效率等瓶颈问题。该系统采用模型-视图-控制器框架,并...
基于OpenCV的图像拼接系统基于OpenCV的图像拼接系统基于OpenCV的图像拼接系统基于OpenCV的图像拼接系统基于OpenCV的图像拼接系统基于OpenCV的图像拼接系统基于OpenCV的图像拼接系统基于OpenCV的图像拼接系统基于...
在Java编程语言中,处理图片拼接和添加水印是一项常见的任务,特别是在开发涉及图像处理的应用或服务时。本文将深入探讨如何使用Java实现这两个功能,包括必要的理论知识、使用到的库以及具体代码实现。 首先,让...
基于OPENCV 的全景图像拼接C++源码.zip基于OPENCV 的全景图像拼接C++源码.zip基于OPENCV 的全景图像拼接C++源码.zip基于OPENCV 的全景图像拼接C++源码.zip基于OPENCV 的全景图像拼接C++源码.zip基于OPENCV 的全景...
OpenCV是一个基于BSD许可证的计算机视觉库,提供了大量的图像处理和计算机视觉函数,可以实现图像处理、特征检测、目标跟踪、图像拼接等功能。通过使用OpenCV,可以实现高质量的图像拼接,满足用户的需求。 在图像...
全景图像拼接是一种将多张局部照片合并成一张宽视角或全方位图像的技术,常用于风光摄影、虚拟现实等领域。在OpenCV库中,提供了一个名为`Stitcher`的类,使得这一过程变得简单易行。本文将详细介绍如何利用OpenCV...
总之,`ImgUtil.java`文件提供了Java中处理图像的基本功能,包括图片合成、图片拼接和图片上写字。通过对这些方法的调用和适当的参数配置,开发者可以轻松地创建出各种图像效果。了解和掌握这些技巧对于Java开发者来...
在本文中,我们将深入探讨如何使用OpenCvSharp库,结合感知哈希算法与图像拼接技术,来实现图片的相似度对比与全景图像生成。首先,我们需要了解OpenCV和OpenCvSharp这两个核心工具。 **OpenCV** 是一个开源的...
本文的工作涵盖了对图像拼接技术历史发展和现有研究成果的总结,深入研究了前人的方法,并可能涉及对不同图像处理技术如Canny算子、拉普拉斯高斯算子和区域生长等在特征提取中的应用,以及各种特征匹配算法如交叉...
图像拼接技术是一种重要的图像处理技术,它涉及多个领域,如照相绘图学、计算机视觉、图像处理和计算机图形学。这一技术的核心是通过对一系列空间重叠的图像进行对齐,创造出一个无缝的、高分辨率的全景图像,以提供...
融合过程中,可能需要处理分辨率差异、视角变化、光照强度差异以及多光谱图像拼接带来的挑战。 在实际应用中,RANSAC算法通常用于解决图像配准中的几何变换问题,如在图像拼接中确定两幅图像之间的射影变换关系。...
医学图像处理是图像拼接应用的另一个重要领域。在医学领域,显微镜或超声波等成像设备往往存在视野较小的问题,而图像拼接技术可以帮助医生获取更广阔的视角,从而便于进行远程诊断和数据分析。 遥感技术在地理信息...
【标题】:“jsp+servlet+c++图像拼接系统”是一个基于Web的图像处理应用,它融合了Java Web技术和C++编程语言,实现了图像的高效拼接功能。在这样的系统中,用户可以通过Web界面上传图片,后台由Servlet进行处理,...