java 使用Graphics2D竖向拼接多张图

工具

package pro.agris.branch.querymachine.util;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
 
public class ImageVerticalConcatenate {
 	//竖向拼接多图
    public static BufferedImage concatenate(List<BufferedImage> images) throws IOException {
        int height = 0, width = 0;
        for (BufferedImage image : images) {
            width = image.getWidth();
            height += image.getHeight();
        }
 
        BufferedImage destImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = destImage.createGraphics();
        int y = 0;
        for (BufferedImage image : images) {
            g2d.drawImage(image, 0, y, null);
            y += image.getHeight();
        }
        g2d.dispose();

        //转为base64
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(destImage, "png", outputStream);
        String base64Image = Base64.getEncoder().encodeToString(outputStream.toByteArray());
        System.out.println("base64Image = " + base64Image);
        return destImage;
    }

	//竖向拼接两张
	private static String concatTwo(String base64Image1, String base64Image2) throws IOException {
        // 解码图片
        byte[] imageBytes1 = Base64.getDecoder().decode(base64Image1);
        byte[] imageBytes2 = Base64.getDecoder().decode(base64Image2);

        // 读取图片
        BufferedImage img1 = ImageIO.read(new ByteArrayInputStream(imageBytes1));
        BufferedImage img2 = ImageIO.read(new ByteArrayInputStream(imageBytes2));

        // 确保两张图片的宽度相同
        if (img1.getWidth() != img2.getWidth()) {
            throw new IllegalArgumentException("Images should have the same width");
        }

        // 创建一个新的BufferedImage来存储拼接后的图片
        BufferedImage concatenatedImg = new BufferedImage(img1.getWidth(), img1.getHeight() + img2.getHeight(), BufferedImage.TYPE_INT_ARGB);

        // 绘制第一张图片
        Graphics2D g2d = concatenatedImg.createGraphics();
        g2d.drawImage(img1, 0, 0, null);

        // 绘制第二张图片
        g2d.drawImage(img2, 0, img1.getHeight(), null);
        g2d.dispose();

        // 将拼接后的图片转换为Base64编码
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(concatenatedImg, "png", outputStream);
        String base64Image = Base64.getEncoder().encodeToString(outputStream.toByteArray());

        // 输出Base64编码
        System.err.println(base64Image);
        return base64Image;
    }
    
	//文件转base64图
	 public static String encodeFileToBase64(File file) {
        try (FileInputStream fileInputStream = new FileInputStream(file)) {
            byte[] fileBytes = new byte[(int) file.length()];
            fileInputStream.read(fileBytes);
            return Base64.getEncoder().encodeToString(fileBytes);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
 
    public static void main(String[] args) throws Exception {
        // 假设有三个图片文件的路径
        List<String> imagePaths = Arrays.asList("D:\\zhuomian_copy\\zhuomian\\测试图\\11.png", "D:\\zhuomian_copy\\zhuomian\\测试图\\11.png", "D:\\zhuomian_copy\\zhuomian\\测试图\\11.png");
        List<BufferedImage> imagesNew=new ArrayList<>();
        for (String imagePath : imagePaths) {
            imagesNew.add(ImageIO.read(new File(imagePath)));
        }

        // 假设有三个base64图片字符串
       /* List<BufferedImage> imagesNew = new ArrayList<>();
        for (String base64Image : imagePaths) {
            // 解码图片
            byte[] imageBytes = Base64.getDecoder().decode(base64Image);
            // 读取图片
            BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageBytes));
            imagesNew.add(img);
        }*/
        BufferedImage concatenatedImage = concatenate(imagesNew);
        //存到本地
        ImageIO.write(concatenatedImage, "PNG", new File("D:\\zhuomian_copy\\zhuomian\\测试图\\test\\concatenated.png"));
		
		//两张图
		File imageFile1 = new File("C:\\Users\\Administrator\\Desktop\\下载_看图王.png"); // 替换为图片文件路径 
		File imageFile2 = new File("C:\\Users\\Administrator\\Desktop\\下载_看图王.png"); // 替换为图片文件路径    
		concatTwo(encodeFileToBase64(imageFile1 ),encodeFileToBase64(imageFile2 ));   
}

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值