From e9a4c26a833fe42b62d7eb3f222aadcd07205731 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 16 Jan 2026 17:07:48 +0800 Subject: [PATCH] =?UTF-8?q?refactor(watermark):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=BE=95=E5=8D=A1=E6=B0=B4=E5=8D=B0=E6=A8=A1=E6=9D=BF=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E5=99=A8=E7=9A=84=E7=94=BB=E5=B8=83=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 画布大小改为原图大小(不再扩展底部区域) - 原图收缩后放置在画布上半部分,为底部留出空间 - 计算原图收缩后的区域高度和底部区域起始Y坐标 - 将原图元素从画布顶部调整为收缩后放在画布上半部分 - 调整Logo、帧途文字和二维码元素的Y坐标计算方式 - 更新布局说明文档以反映新的设计策略 --- .../edge/LeicaWatermarkTemplateBuilder.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ycwl/basic/image/watermark/edge/LeicaWatermarkTemplateBuilder.java b/src/main/java/com/ycwl/basic/image/watermark/edge/LeicaWatermarkTemplateBuilder.java index 02b45f64..38f71543 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/edge/LeicaWatermarkTemplateBuilder.java +++ b/src/main/java/com/ycwl/basic/image/watermark/edge/LeicaWatermarkTemplateBuilder.java @@ -12,8 +12,8 @@ import java.util.Map; * 对应 LeicaWatermarkOperator * * 布局说明: - * - 画布高度 = 原图高度 + 底部扩展区域(白色背景) - * - 原图放在画布顶部 + * - 画布大小 = 原图大小(不扩展) + * - 原图收缩放在画布上半部分,底部留出空间 * - 底部白色区域左侧:帧途 Logo + "帧途" 文字 * - 底部白色区域右侧:二维码(含头像)+ 景区名 + 日期时间 */ @@ -53,9 +53,14 @@ public class LeicaWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuil int imageWidth = request.getImageWidth(); int imageHeight = request.getImageHeight(); - // 画布高度 = 原图高度 + 底部扩展区域 + // 画布大小 = 原图大小(不扩展) int canvasWidth = imageWidth; - int canvasHeight = imageHeight + EXTRA_BOTTOM_PX; + int canvasHeight = imageHeight; + + // 原图收缩后的区域高度 + int shrunkImageHeight = imageHeight - EXTRA_BOTTOM_PX; + // 底部区域起始 Y 坐标 + int bottomAreaY = shrunkImageHeight; // 创建模板(白色背景) PuzzleTemplateEntity template = createTemplateWithColor( @@ -68,18 +73,18 @@ public class LeicaWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuil List elements = newElementList(); Map dynamicData = newDynamicData(); - // 1. 原图元素(放在画布顶部) + // 1. 原图元素(收缩放在画布上半部分) PuzzleElementEntity originalImageElement = createImageElement( "originalImage", "原图", 0, 0, - imageWidth, imageHeight, 1, + imageWidth, shrunkImageHeight, 1, FIT_MODE_COVER, null, null ); elements.add(originalImageElement); dynamicData.put("originalImage", request.getOriginalImageUrl()); // 2. Logo 元素(底部左侧) - int logoY = imageHeight + OFFSET_Y + LOGO_EXTRA_BORDER; + int logoY = bottomAreaY + OFFSET_Y + LOGO_EXTRA_BORDER; PuzzleElementEntity logoElement = createImageElement( "logo", "Logo", OFFSET_X, logoY - 12, @@ -91,7 +96,7 @@ public class LeicaWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuil // 3. "帧途" 文字(Logo 右边) int logoTextX = OFFSET_X + LOGO_SIZE + 5; - int logoTextY = imageHeight + OFFSET_Y + LOGO_EXTRA_BORDER; + int logoTextY = bottomAreaY + OFFSET_Y + LOGO_EXTRA_BORDER; PuzzleElementEntity logoTextElement = createTextElement( "logoText", "帧途文字", logoTextX, logoTextY, @@ -113,7 +118,7 @@ public class LeicaWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuil ); int qrcodeX = canvasWidth - OFFSET_X - qrcodeWidth - QRCODE_OFFSET_X - estimatedTextWidth; - int qrcodeY = imageHeight + OFFSET_Y - QRCODE_OFFSET_Y; + int qrcodeY = bottomAreaY + OFFSET_Y - QRCODE_OFFSET_Y; // 5. 二维码元素 PuzzleElementEntity qrcodeElement = createImageElement(