|
|
@@ -0,0 +1,123 @@
|
|
|
+package com.fs.hospital580.util;
|
|
|
+
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.json.JSONObject;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.fs.common.core.redis.RedisCache;
|
|
|
+import com.fs.common.utils.AbsolutePosition;
|
|
|
+import com.fs.system.oss.CloudStorageService;
|
|
|
+import com.fs.system.oss.OSSFactory;
|
|
|
+import com.fs.system.service.ISysConfigService;
|
|
|
+import net.coobird.thumbnailator.Thumbnails;
|
|
|
+import net.coobird.thumbnailator.geometry.Positions;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import javax.imageio.ImageIO;
|
|
|
+import java.awt.image.BufferedImage;
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.net.URL;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class ThumbnailatorWatermark {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisCache redisCache;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISysConfigService configService;
|
|
|
+
|
|
|
+
|
|
|
+ public String addWatermarkToNetworkImage(Long preId, Integer orderStatus, String signUrl) {
|
|
|
+ try {
|
|
|
+ // 处方原图
|
|
|
+ String imageUrl = redisCache.getCacheObject("prescription:dstFilePath:" + preId);
|
|
|
+ if (ObjectUtil.isEmpty(imageUrl)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ // 水印图片
|
|
|
+ String watermarkURLJson = configService.selectConfigByKey("his.prescription.url");
|
|
|
+ JSONObject jsonObject = JSONUtil.parseObj(watermarkURLJson);
|
|
|
+
|
|
|
+ // 读取原图片
|
|
|
+ URL url = new URL(imageUrl);
|
|
|
+ InputStream inputStream = url.openStream();
|
|
|
+ String watermarkImageUrl = "";
|
|
|
+ switch (orderStatus) {
|
|
|
+ // 代付款
|
|
|
+ case 1:
|
|
|
+ watermarkImageUrl = jsonObject.getStr("start");
|
|
|
+ break;
|
|
|
+ // 退款
|
|
|
+ case 3:
|
|
|
+ watermarkImageUrl = jsonObject.getStr("end");
|
|
|
+ break;
|
|
|
+ // 已支付
|
|
|
+ default:
|
|
|
+ watermarkImageUrl = jsonObject.getStr("ing");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // 读取水印图片
|
|
|
+ URL watermarkURL = new URL(watermarkImageUrl);
|
|
|
+ InputStream watermarkInputStream = watermarkURL.openStream();
|
|
|
+ BufferedImage watermarkImage = ImageIO.read(watermarkInputStream);
|
|
|
+ // 缩放水印
|
|
|
+ // 2. 计算并缩放水印图尺寸 (例如:缩放到原图宽度的1/8)
|
|
|
+ int newWatermarkWidth = watermarkImage.getWidth() / 8;
|
|
|
+ // 按水印图原比例计算高度
|
|
|
+ int newWatermarkHeight = (int) ((double) newWatermarkWidth / watermarkImage.getWidth() * watermarkImage.getHeight());
|
|
|
+ BufferedImage scaledWatermark = Thumbnails.of(watermarkImage)
|
|
|
+ .size(newWatermarkWidth, newWatermarkHeight)
|
|
|
+ .asBufferedImage();
|
|
|
+
|
|
|
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
|
|
+ if (ObjectUtil.isNotEmpty(signUrl)) {
|
|
|
+ // 创建签名图片
|
|
|
+ URL watermarkURL2 = new URL(signUrl);
|
|
|
+ InputStream watermarkInputStream2 = watermarkURL2.openStream();
|
|
|
+ BufferedImage signatureImage = ImageIO.read(watermarkInputStream2);
|
|
|
+ // 缩放水印
|
|
|
+ // 2. 计算并缩放水印图尺寸 (例如:缩放到原图宽度的1/4)
|
|
|
+ int newWatermarkWidth2 = signatureImage.getWidth() / 8;
|
|
|
+ // 按水印图原比例计算高度
|
|
|
+ int newWatermarkHeight2 = (int) ((double) newWatermarkWidth2 / signatureImage.getWidth() * signatureImage.getHeight());
|
|
|
+ BufferedImage scaledWatermark2 = Thumbnails.of(signatureImage)
|
|
|
+ .size(newWatermarkWidth2, newWatermarkHeight2)
|
|
|
+ .asBufferedImage();
|
|
|
+
|
|
|
+ // 使用Thumbnailator处理并输出到字节数组
|
|
|
+ Thumbnails.of(inputStream)
|
|
|
+ .scale(1)
|
|
|
+ .watermark(Positions.TOP_RIGHT, scaledWatermark, 0.5f)
|
|
|
+ .watermark(
|
|
|
+ new AbsolutePosition(800, 1300), // 使用自定义坐标位置
|
|
|
+ scaledWatermark2,
|
|
|
+ 1f // 透明度
|
|
|
+ )
|
|
|
+ .outputQuality(0.9)
|
|
|
+ .outputFormat("jpg")
|
|
|
+ .toOutputStream(outputStream);
|
|
|
+ } else {
|
|
|
+ Thumbnails.of(inputStream)
|
|
|
+ .scale(1)
|
|
|
+ .watermark(Positions.TOP_RIGHT, scaledWatermark, 0.5f)
|
|
|
+ .outputQuality(0.9)
|
|
|
+ .outputFormat("jpg")
|
|
|
+ .toOutputStream(outputStream);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ inputStream.close();
|
|
|
+ // 处方图片阶段
|
|
|
+ redisCache.setCacheObject("prescription:dstFilePath:phase" + preId, orderStatus, 2, TimeUnit.DAYS);
|
|
|
+ CloudStorageService storage = OSSFactory.build();
|
|
|
+ return storage.uploadSuffix(outputStream.toByteArray(), ".jpg");
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.err.println("添加水印失败: " + e.getMessage());
|
|
|
+ e.printStackTrace();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|