java使用BufferedImage操作合成图片

时间:2023-02-05 08:34:40

JAVA中使用BufferedImage操作合成图片,在一张图片上加入新的图片和文字等等。其中Mat是opencv的类,懒得改了,本人试过使用OPENCV进行类似的处理,结果总是失败,所以把Mat转换成为BufferedImage后,再进行处理,以下是关键方法,供大家学习使用,省得走弯路,有使用Mat能够实现的同学也请指导一番。谢谢。


public static void drawNew(String filename,String filename2,String savepath) throws IOException{
		Mat image = Highgui.imread(filename);
		Mat image2 = Highgui.imread(filename2);
		BufferedImage buf = Mat2BufferedImage(image);
		BufferedImage buf2 = Mat2BufferedImage(image2);
		//
		int w = image.width(),w1 = 200,h = image.height();
		BufferedImage newimage = new BufferedImage(w + w1, h,
				BufferedImage.TYPE_INT_RGB);
		//
		
		Graphics2D g = newimage.createGraphics();
		// draw start
		g.drawImage(buf, 0, 0, w, h, null);
		g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1f));
		
		g.drawImage(buf2, w, 0, w1, h, null);
		// 图片中标识 start
		g.setColor(Color.BLACK);
		g.drawString("目标数量:12", w + 1, 12);
		g.setColor(Color.RED);
		g.drawLine(w, 20, w + w1, 20);
		// end
		// list start
		g.setColor(Color.BLACK);
		for(int i = 0;i < 5;i++){
			g.drawString("目标"+i+":10,20,100,100", w + 1, 30 + i * 15);
		}
		// draw end
		g.dispose();
		ImageIO.write(newimage, "JPEG", new File(savepath));
	}


public static Mat bufferedImage2Mat(BufferedImage in) {
		BufferedImage image = new BufferedImage(in.getWidth(), in.getHeight(),
				BufferedImage.TYPE_3BYTE_BGR);

		// Draw the image onto the new buffer
		Graphics2D g = image.createGraphics();
		try {
			g.setComposite(AlphaComposite.Src);
			g.drawImage(in, 0, 0, null);
		} finally {
			g.dispose();
		}
		byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer())
				.getData();
		Mat mat = Mat.eye(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
		mat.put(0, 0, pixels);
		return mat;
	}
	
	public static BufferedImage Mat2BufferedImage(Mat image){
		BufferedImage buf = null;
		MatOfByte mob = new MatOfByte();
	 	Highgui.imencode(".jpg", image, mob);
	 	byte[] byteArray = mob.toArray();
	 	InputStream in = new ByteArrayInputStream(byteArray);
	 	try {
			buf = ImageIO.read(in);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 	return buf;
	}