diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkConfig.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkConfig.java index f67bd084..8e9b91a5 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkConfig.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkConfig.java @@ -7,6 +7,7 @@ import lombok.Builder; import lombok.Getter; import java.io.File; +import java.util.List; /** * 水印Stage配置 @@ -67,4 +68,16 @@ public class WatermarkConfig { */ @Builder.Default private final long edgeTimeoutMs = 10_000L; + + /** + * 打印水印竖版URL列表 + * 用于在竖屏图片上添加全屏水印叠加层(在原图上方,文字/二维码下方) + */ + private final List printWatermarkPUrlList; + + /** + * 打印水印横版URL列表 + * 用于在横屏图片上添加全屏水印叠加层(在原图上方,文字/二维码下方) + */ + private final List printWatermarkLUrlList; } diff --git a/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkStage.java b/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkStage.java index c9d82778..182af692 100644 --- a/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkStage.java +++ b/src/main/java/com/ycwl/basic/image/pipeline/stages/WatermarkStage.java @@ -241,6 +241,10 @@ public class WatermarkStage extends AbstractPipelineStage { } } + // 传递打印水印URL列表(横竖版由边缘端根据图片实际尺寸判断) + info.setPrintWatermarkPUrlList(config.getPrintWatermarkPUrlList()); + info.setPrintWatermarkLUrlList(config.getPrintWatermarkLUrlList()); + return info; } } diff --git a/src/main/java/com/ycwl/basic/image/watermark/edge/PrinterDefaultWatermarkTemplateBuilder.java b/src/main/java/com/ycwl/basic/image/watermark/edge/PrinterDefaultWatermarkTemplateBuilder.java index e3307a47..f7b1c89e 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/edge/PrinterDefaultWatermarkTemplateBuilder.java +++ b/src/main/java/com/ycwl/basic/image/watermark/edge/PrinterDefaultWatermarkTemplateBuilder.java @@ -77,6 +77,18 @@ public class PrinterDefaultWatermarkTemplateBuilder extends AbstractWatermarkTem elements.add(originalImageElement); dynamicData.put("originalImage", request.getOriginalImageUrl()); + // 0.5 打印水印叠加层(z-index=5,全屏覆盖,在原图上方、文字/二维码下方) + if (request.getPrintWatermarkUrl() != null && !request.getPrintWatermarkUrl().isEmpty()) { + PuzzleElementEntity printWatermarkElement = createImageElement( + "printWatermark", "打印水印", + 0, 0, + imageWidth, imageHeight, 5, + FIT_MODE_COVER, null, null + ); + elements.add(printWatermarkElement); + dynamicData.put("printWatermark", request.getPrintWatermarkUrl()); + } + // 计算二维码位置 int qrcodeWidth = scaledQrcodeSize; int qrcodeHeight = scaledQrcodeSize; diff --git a/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkEdgeService.java b/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkEdgeService.java index 648ebc59..30c96b9d 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkEdgeService.java +++ b/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkEdgeService.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Date; +import java.util.List; import java.util.UUID; /** @@ -237,6 +238,8 @@ public class WatermarkEdgeService { .offsetRight(info.getOffsetRight()) .offsetTop(info.getOffsetTop()) .offsetBottom(info.getOffsetBottom()) + .printWatermarkUrl(resolvePrintWatermarkUrl(imageWidth, imageHeight, + info.getPrintWatermarkPUrlList(), info.getPrintWatermarkLUrlList())) .outputFormat(type.getPreferFileType().equalsIgnoreCase("png") ? "PNG" : "JPEG") .outputQuality(90) .build(); @@ -294,6 +297,25 @@ public class WatermarkEdgeService { }; } + /** + * 根据图片方向从URL列表中选取对应的打印水印URL + * + * @param imageWidth 图片宽度 + * @param imageHeight 图片高度 + * @param pUrlList 竖版URL列表 + * @param lUrlList 横版URL列表 + * @return 选中的URL,无可用URL时返回null + */ + private String resolvePrintWatermarkUrl(int imageWidth, int imageHeight, + List pUrlList, List lUrlList) { + boolean isLandscape = imageWidth >= imageHeight; + List urlList = isLandscape ? lUrlList : pUrlList; + if (urlList != null && !urlList.isEmpty()) { + return urlList.get(0); + } + return null; + } + /** * 获取图片尺寸 * diff --git a/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkRequest.java b/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkRequest.java index 1eb8c0ea..3259ab14 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkRequest.java +++ b/src/main/java/com/ycwl/basic/image/watermark/edge/WatermarkRequest.java @@ -70,6 +70,12 @@ public class WatermarkRequest { @Builder.Default private Integer outputQuality = 75; + /** + * 打印水印URL(根据图片方向已解析的单个URL) + * 用于在原图上方、文字/二维码下方添加全屏水印叠加层 + */ + private String printWatermarkUrl; + public double getScaleValue() { return scale != null ? scale : 1.0; } diff --git a/src/main/java/com/ycwl/basic/image/watermark/entity/WatermarkInfo.java b/src/main/java/com/ycwl/basic/image/watermark/entity/WatermarkInfo.java index 4cabb67a..6d0dc39f 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/entity/WatermarkInfo.java +++ b/src/main/java/com/ycwl/basic/image/watermark/entity/WatermarkInfo.java @@ -5,6 +5,7 @@ import lombok.Data; import java.io.File; import java.util.Date; +import java.util.List; @Data public class WatermarkInfo { @@ -40,6 +41,16 @@ public class WatermarkInfo { */ private Double scale; + /** + * 打印水印竖版URL列表 + */ + private List printWatermarkPUrlList; + + /** + * 打印水印横版URL列表 + */ + private List printWatermarkLUrlList; + public String getDatetimeLine() { if (datetimeLine == null) { datetimeLine = DateUtil.format(datetime, dtFormat); diff --git a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java index 0fd365b4..a865f72b 100644 --- a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java @@ -1084,6 +1084,8 @@ public class PrinterServiceImpl implements PrinterService { String scenicText = scenicConfig.getString("print_watermark_scenic_text", ""); String dateFormat = scenicConfig.getString("print_watermark_dt_format", "yyyy.MM.dd"); + List printWatermarkPUrlList = scenicConfig.getList("print_watermark_p_url", String.class); + List printWatermarkLUrlList = scenicConfig.getList("print_watermark_l_url", String.class); return WatermarkConfig.builder() .watermarkType(watermarkType) @@ -1094,6 +1096,8 @@ public class PrinterServiceImpl implements PrinterService { .edgeEnabled(true) .qrcodeFile(qrCodeFile) .scale(scale) + .printWatermarkPUrlList(printWatermarkPUrlList) + .printWatermarkLUrlList(printWatermarkLUrlList) .build(); }