package com.pavis.ctr.audit.common.utils; import com.baidubce.services.bos.BosClient; import org.apache.commons.lang3.StringUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; /** * @author semi * @create 2023-05-15 14:21 */ public class ImageUtils { /** * 合并任数量的图片成一张图片 * * @param isHorizontal true代表水平合并,fasle代表垂直合并 * @param imgs 待合并的图片数组 * @return * @throws IOException */ public static BufferedImage mergeImage(boolean isHorizontal, BufferedImage[] imgs) throws IOException { // 生成新图片 BufferedImage destImage = null; // 计算新图片的长和高 int allw = 0, allh = 0, allwMax = 0, allhMax = 0; // 获取总长、总宽、最长、最宽 for (int i = 0; i < imgs.length; i++) { BufferedImage img = imgs[i]; allw += img.getWidth(); allh += img.getHeight(); if (img.getWidth() > allwMax) { allwMax = img.getWidth(); } if (img.getHeight() > allhMax) { allhMax = img.getHeight(); } } // 创建新图片 if (isHorizontal) { destImage = new BufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB); } else { destImage = new BufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB); } // 合并所有子图片到新图片 int wx = 0, wy = 0; for (int i = 0; i < imgs.length; i++) { BufferedImage img = imgs[i]; int w1 = img.getWidth(); int h1 = img.getHeight(); // 从图片中读取RGB int[] ImageArrayOne = new int[w1 * h1]; ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中 if (isHorizontal) { // 水平方向合并 destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB } else { // 垂直方向合并 destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB } wx += w1; wy += h1; } return destImage; } /** * 纵向拼接一组(多张)图像 * * @param pics 将要拼接的图像数组 * @param type 写入图像类型 * @param dstPic 写入图像路径 * @return */ public static String joinImageListVertical(String[] pics, String type, String dstPic, BosClient client) { try { int len = pics.length; if (len == 1) { return pics[0]; } BufferedImage[] images = new BufferedImage[len]; for (int i = 0; i < len; i++) { images[i] = ImageIO.read(new URL(pics[i])); } BufferedImage dstImg = mergeImage(false, images); File file = new File(dstPic); ImageIO.write(dstImg, type, file); // 上传至bos return BosUtils.putByName(client, StringUtils.substringAfterLast(dstPic, "/"), file); } catch (IOException e) { e.printStackTrace(); return ""; } } }