|
@@ -0,0 +1,98 @@
|
|
|
+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 "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|