refactor(watermark): 调整徕卡水印模板构建器的画布布局策略

- 画布大小改为原图大小(不再扩展底部区域)
- 原图收缩后放置在画布上半部分,为底部留出空间
- 计算原图收缩后的区域高度和底部区域起始Y坐标
- 将原图元素从画布顶部调整为收缩后放在画布上半部分
- 调整Logo、帧途文字和二维码元素的Y坐标计算方式
- 更新布局说明文档以反映新的设计策略
This commit is contained in:
2026-01-16 17:07:48 +08:00
parent 8c76a4fb03
commit e9a4c26a83

View File

@@ -12,8 +12,8 @@ import java.util.Map;
* 对应 LeicaWatermarkOperator * 对应 LeicaWatermarkOperator
* *
* 布局说明: * 布局说明:
* - 画布高度 = 原图高度 + 底部扩展区域(白色背景 * - 画布大小 = 原图大小(不扩展
* - 原图放在画布顶部 * - 原图收缩放在画布上半部分,底部留出空间
* - 底部白色区域左侧:帧途 Logo + "帧途" 文字 * - 底部白色区域左侧:帧途 Logo + "帧途" 文字
* - 底部白色区域右侧:二维码(含头像)+ 景区名 + 日期时间 * - 底部白色区域右侧:二维码(含头像)+ 景区名 + 日期时间
*/ */
@@ -53,9 +53,14 @@ public class LeicaWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuil
int imageWidth = request.getImageWidth(); int imageWidth = request.getImageWidth();
int imageHeight = request.getImageHeight(); int imageHeight = request.getImageHeight();
// 画布高度 = 原图高度 + 底部扩展区域 // 画布大小 = 原图大小(不扩展)
int canvasWidth = imageWidth; 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( PuzzleTemplateEntity template = createTemplateWithColor(
@@ -68,18 +73,18 @@ public class LeicaWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuil
List<PuzzleElementEntity> elements = newElementList(); List<PuzzleElementEntity> elements = newElementList();
Map<String, String> dynamicData = newDynamicData(); Map<String, String> dynamicData = newDynamicData();
// 1. 原图元素(放在画布顶部 // 1. 原图元素(收缩放在画布上半部分
PuzzleElementEntity originalImageElement = createImageElement( PuzzleElementEntity originalImageElement = createImageElement(
"originalImage", "原图", "originalImage", "原图",
0, 0, 0, 0,
imageWidth, imageHeight, 1, imageWidth, shrunkImageHeight, 1,
FIT_MODE_COVER, null, null FIT_MODE_COVER, null, null
); );
elements.add(originalImageElement); elements.add(originalImageElement);
dynamicData.put("originalImage", request.getOriginalImageUrl()); dynamicData.put("originalImage", request.getOriginalImageUrl());
// 2. Logo 元素(底部左侧) // 2. Logo 元素(底部左侧)
int logoY = imageHeight + OFFSET_Y + LOGO_EXTRA_BORDER; int logoY = bottomAreaY + OFFSET_Y + LOGO_EXTRA_BORDER;
PuzzleElementEntity logoElement = createImageElement( PuzzleElementEntity logoElement = createImageElement(
"logo", "Logo", "logo", "Logo",
OFFSET_X, logoY - 12, OFFSET_X, logoY - 12,
@@ -91,7 +96,7 @@ public class LeicaWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuil
// 3. "帧途" 文字(Logo 右边) // 3. "帧途" 文字(Logo 右边)
int logoTextX = OFFSET_X + LOGO_SIZE + 5; 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( PuzzleElementEntity logoTextElement = createTextElement(
"logoText", "帧途文字", "logoText", "帧途文字",
logoTextX, logoTextY, logoTextX, logoTextY,
@@ -113,7 +118,7 @@ public class LeicaWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuil
); );
int qrcodeX = canvasWidth - OFFSET_X - qrcodeWidth - QRCODE_OFFSET_X - estimatedTextWidth; 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. 二维码元素 // 5. 二维码元素
PuzzleElementEntity qrcodeElement = createImageElement( PuzzleElementEntity qrcodeElement = createImageElement(