JAva合成画像は複数の横方向または縦方向を合成する

30209 ワード

JAvaピクチャ横方向または縦方向の合成ピクチャを複数合成する
前言:仕事で出会ったら、画像を合成して、スクリーンショットをしています.多くの問題にも遭遇し、出会った穴も分かち合った.画像の切り取り:https://blog.csdn.net/qq_34846877/article/details/81324779要件:複数のピクチャを合成し、合成されたピクチャからピクチャを切り取る.本稿では画像を合成する方法だけを書きます.2つ目の案をお勧めします.
  • シナリオ1、BufferedImageを使用する2枚のピクチャの幅は一致する
  • である.
    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);
    	}
    }
    
    
  • 案2 1、BufferedImageとGraphicsを使うと幅が一致しなくてもいいですが、合成された画像はちょっとおかしいですよ.でも、ほとんど差がなければ、影響はありません.私は採用した第2の方案で、親測は役に立ち、あなたに便利になることを望んでいます.
  • ////   
    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); 	
    	}
    }	
    

    以上が私が今回の仕事で使った2つの合成画像案で、2つ目の互換性が強く、java.lang.ArrayIndexOutOfBoundsException:Coordinate out of boundsは現れません!に表示されます.2つ目をお勧めします.参考にしたブログ1:https://blog.csdn.net/henren555/article/details/36924939 ブログ2:2番目のブログを忘れてしまいましたが、後で見つけたら更新します.最適化できるところがあればいつでもメッセージでお知らせください、ありがとうございます!