java合并图片合成多张横向或竖向

java图片合并 多张横向或竖向合成图片

前言:工作遇到需要把图片合成一张图片,在进行截图。也遇到了很多问题,遇到的坑也分享出来。
图片截取:https://blog.csdn.net/qq_34846877/article/details/81324779
需求:先合成多张图片,然后在合成的图片中截取图片。本文中只写合成图片的方法。推荐第二种方案。

  • 方案一
    1、使用BufferedImage 两张图片的宽度要一致
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;

public class PicImageTest3 {

	/**
	 * 竖向合成
	 * 注意:该方法合成图片需要图片的宽度一样,高度不一致也可以(查阅网上知道的,实际上有时候就是不行,蓝瘦香菇。)
	 * @param files	传入的图片
	 * @param newFileName	合成图片的名称
	 */*/
	public static void jointPic(List<File> files, String newFileName) {
		try {
			BufferedImage[] imgs = new BufferedImage[files.size()];
			//合成图片的总高度
			int h = 0;
			for (int i = 0; i < files.size(); i++) {
				imgs[i] = ImageIO.read(files.get(i));
				h += imgs[i].getHeight();
			}
			int width = imgs[0].getWidth();
			int height = imgs[0].getHeight();
			int[] imgArray = new int[width * height];
			// 合成图片的参数 width要合成图片宽度(已第一张图片宽度为准),h合成图片的总高度
			BufferedImage imgNew = new BufferedImage(width, h, BufferedImage.TYPE_INT_RGB);
			int _height = 0;	
			for (int i = 0; i < imgs.length; i++) {
				imgs[i].getRGB(0, 0, width, height, imgArray, 0, width);
				imgNew.setRGB(0, _height, width, height, imgArray, 0, width);
				_height += imgs[i].getHeight();
			}
			File outFile = new File("C:/Users/Administrator/Desktop/001/" + newFileName);
			ImageIO.write(imgNew, "jpg", outFile);// 写图片
			System.out.println("===合并成功===");
		} catch (Exception e) {
			System.out.println("===合并失败===");
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws IOException {
		List<File> files = new ArrayList<>();
		String newFileName = "new001e.jpg";
		File file1 = new File("C:/Users/Administrator/Desktop/001/NO1.jpg");	//2295	成功
		File file2 = new File("C:/Users/Administrator/Desktop/001/NO2.jpg");	//2298
		files.add(file1);
		files.add(file2);
		jointPic(files, newFileName);
	}
}

  • 方案二
    1、使用BufferedImage 和 Graphics 宽高可以不一致,但是合成的图片就有点奇怪了哦,不过基本相差不大的话,没有影响。我是采用的第二种方案,亲测有用,希望能够带给你便利。
// 下面是横向合成的代码,替换下面的 竖向 代码即可
// 横向
if (i==0) {
	allHeight = imgs.get(0).getHeight();
}
allWidth += imgs.get(i).getWidth();
// 横向合成
Integer width = 0;
for(int i=0; i< imgs.size(); i++){
	g.drawImage(imgs.get(i), width, 0, null);
	width +=  imgs.get(i).getWidth();
}
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;

public class PicImageTest {
	public static void jointPic(List<File> files, String path) {   
		try {
			Integer allWidth = 0;	// 图片总宽度
			Integer allHeight = 0;	// 图片总高度
			List<BufferedImage> imgs = new ArrayList<>(); 
			for(int i=0; i<files.size(); i++){
				imgs.add(ImageIO.read(files.get(i)));
				//竖向
				if (i==0) {
					allWidth = imgs.get(0).getWidth();
				}
				allHeight += imgs.get(i).getHeight();
			}
	        BufferedImage combined = new BufferedImage(allWidth, allHeight, BufferedImage.TYPE_INT_RGB);  
	        // paint both images, preserving the alpha channels  
	        Graphics g = combined.getGraphics();
	         // 竖向合成
	        Integer height = 0;
	        for(int i=0; i< imgs.size(); i++){
        		g.drawImage(imgs.get(i), 0, height, null);  
        		height +=  imgs.get(i).getHeight();
	        }
	        ImageIO.write(combined, "jpg", new File(path));  
	        System.out.println("===合成成功====");
		} catch (Exception e) {
			System.out.println("===合成失败====");
			e.printStackTrace();
		}
    }
	
	public static void main(String[] args) throws Exception{
		List<File> files = new ArrayList<>();	
		File file1 = new File("C:/Users/Administrator/Desktop/001/NO1.jpg");
		File file2 = new File("C:/Users/Administrator/Desktop/001/NO2.jpg");
		files.add(file1);
		files.add(file2);
		String path = "C:/Users/Administrator/Desktop/001/NO-new-4.jpg";
		jointPic(files, path); 	
	}
}	

以上就是我在这次工作中用的两种合成图片方案,第二种兼容性强点,不会出现java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! 的错误。
推荐第二种。
如下是参考的博客一:https://blog.csdn.net/henren555/article/details/36924939
博客二:
第二个博客忘记了,后面找到会更新上去。
如果有可以优化的地方随时留言告知,感谢!

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值