1. 程式人生 > >java合併圖片合成多張橫向或豎向

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
部落格二:
第二個部落格忘記了,後面找到會更新上去。
如果有可以優化的地方隨時留言告知,感謝!