前言:工作遇到需要把图片合成一张图片,在进行截图。也遇到了很多问题,遇到的坑也分享出来。
图片截取:https://blog.csdn.net/qq_34846877/article/details/81324779
需求:先合成多张图片,然后在合成的图片中截取图片。本文中只写合成图片的方法。推荐第二种方案。
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);
}
}
// 下面是横向合成的代码,替换下面的 竖向 代码即可
// 横向
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
博客二:
第二个博客忘记了,后面找到会更新上去。
如果有可以优化的地方随时留言告知,感谢!