diff --git a/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java b/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java index eaab9752..2c546475 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java +++ b/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java @@ -20,6 +20,8 @@ public class ImageWatermarkFactory { case NORMAL -> new NormalWatermarkOperator(); case LEICA -> new LeicaWatermarkOperator(); case PRINTER_DEFAULT -> new PrinterDefaultWatermarkOperator(); + case PUZZLE_PRINT -> throw new ImageWatermarkUnsupportedException( + "PUZZLE_PRINT 仅支持边缘端处理,请使用 WatermarkEdgeService"); }; } } 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 1ed3781f..648ebc59 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 @@ -290,6 +290,7 @@ public class WatermarkEdgeService { case NORMAL -> NormalWatermarkTemplateBuilder.STYLE; case LEICA -> LeicaWatermarkTemplateBuilder.STYLE; case PRINTER_DEFAULT -> PrinterDefaultWatermarkTemplateBuilder.STYLE; + case PUZZLE_PRINT -> PuzzlePrintWatermarkTemplateBuilder.STYLE; }; } diff --git a/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java b/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java index ba611e56..43c3b45d 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java +++ b/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java @@ -6,7 +6,8 @@ import lombok.Getter; public enum ImageWatermarkOperatorEnum { LEICA("leica", "jpg"), NORMAL("normal", "jpg"), - PRINTER_DEFAULT("pDefault", "jpg"); + PRINTER_DEFAULT("pDefault", "jpg"), + PUZZLE_PRINT("puzzle_print", "jpg"); private final String type; private final String preferFileType; 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 63947f05..8ca9b63d 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 @@ -16,7 +16,6 @@ import com.ycwl.basic.image.pipeline.stages.ImageEnhanceStage; import com.ycwl.basic.image.pipeline.stages.ImageOrientationStage; import com.ycwl.basic.image.pipeline.stages.ImageResizeStage; import com.ycwl.basic.image.pipeline.stages.ImageSRStage; -import com.ycwl.basic.image.pipeline.stages.PuzzleBorderStage; import com.ycwl.basic.image.pipeline.stages.RestoreOrientationStage; import com.ycwl.basic.image.pipeline.stages.UpdateMemberPrintStage; import com.ycwl.basic.image.pipeline.stages.UploadStage; @@ -896,12 +895,14 @@ public class PrinterServiceImpl implements PrinterService { } /** - * 创建拼图处理管线 + * 创建拼图打印处理管线(带专用水印) + * + * @param watermarkConfig 水印配置 */ - private Pipeline createPuzzlePipeline() { - return new PipelineBuilder("PuzzlePipeline") + private Pipeline createPuzzlePrintPipeline(WatermarkConfig watermarkConfig) { + return new PipelineBuilder("PuzzlePrintPipeline") .addStage(new DownloadStage()) - .addStage(new PuzzleBorderStage()) + .addStage(new WatermarkStage(watermarkConfig)) .addStage(new UploadStage()) .addStage(new CleanupStage()) .build(); @@ -1002,9 +1003,10 @@ public class PrinterServiceImpl implements PrinterService { prepareStorageAdapter(context); pipeline = createNormalPhotoPipeline(watermarkConfig); } else { - // 拼图处理流程 + // 拼图处理流程(使用专用水印) + WatermarkConfig watermarkConfig = preparePuzzleWatermarkConfig(context, qrCodeFile); prepareStorageAdapter(context); - pipeline = createPuzzlePipeline(); + pipeline = createPuzzlePrintPipeline(watermarkConfig); } boolean success = pipeline.execute(context); @@ -1064,6 +1066,36 @@ public class PrinterServiceImpl implements PrinterService { .build(); } + /** + * 准备拼图打印的水印配置 + * 使用拼图专用水印模板 + * + * @param context 照片处理上下文 + * @param qrCodeFile 二维码文件 + * @return WatermarkConfig + */ + private WatermarkConfig preparePuzzleWatermarkConfig(PhotoProcessContext context, File qrCodeFile) { + ScenicConfigManager scenicConfig = context.getScenicConfigManager(); + + String scenicText = scenicConfig != null + ? scenicConfig.getString("print_watermark_scenic_text", "") + : ""; + String dateFormat = scenicConfig != null + ? scenicConfig.getString("print_watermark_dt_format", "yyyy.MM.dd") + : "yyyy.MM.dd"; + + return WatermarkConfig.builder() + .watermarkType(ImageWatermarkOperatorEnum.PUZZLE_PRINT) + .scenicText(scenicText) + .dateFormat(dateFormat) + .edgeService(watermarkEdgeService) + .storageAdapter(StorageFactory.use()) + .edgeEnabled(true) + .qrcodeFile(qrCodeFile) + .scale(1.0) + .build(); + } + /** * 准备存储适配器 * 从context中的scenicConfigManager获取配置