You've already forked FrameTour-BE
feat(watermark): 添加打印水印功能支持
- 在WatermarkConfig中添加竖版和横版打印水印URL列表配置 - 将打印水印URL列表传递给WatermarkStage处理 - 在PrinterDefaultWatermarkTemplateBuilder中实现打印水印叠加层功能 - 添加resolvePrintWatermarkUrl方法根据图片方向选择对应URL - 在WatermarkRequest和WatermarkInfo中添加打印水印相关字段 - 从配置文件读取打印水印URL列表并构建到WatermarkConfig中
This commit is contained in:
@@ -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<String> printWatermarkPUrlList;
|
||||
|
||||
/**
|
||||
* 打印水印横版URL列表
|
||||
* 用于在横屏图片上添加全屏水印叠加层(在原图上方,文字/二维码下方)
|
||||
*/
|
||||
private final List<String> printWatermarkLUrlList;
|
||||
}
|
||||
|
||||
@@ -241,6 +241,10 @@ public class WatermarkStage extends AbstractPipelineStage<PhotoProcessContext> {
|
||||
}
|
||||
}
|
||||
|
||||
// 传递打印水印URL列表(横竖版由边缘端根据图片实际尺寸判断)
|
||||
info.setPrintWatermarkPUrlList(config.getPrintWatermarkPUrlList());
|
||||
info.setPrintWatermarkLUrlList(config.getPrintWatermarkLUrlList());
|
||||
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<String> pUrlList, List<String> lUrlList) {
|
||||
boolean isLandscape = imageWidth >= imageHeight;
|
||||
List<String> urlList = isLandscape ? lUrlList : pUrlList;
|
||||
if (urlList != null && !urlList.isEmpty()) {
|
||||
return urlList.get(0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取图片尺寸
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<String> printWatermarkPUrlList;
|
||||
|
||||
/**
|
||||
* 打印水印横版URL列表
|
||||
*/
|
||||
private List<String> printWatermarkLUrlList;
|
||||
|
||||
public String getDatetimeLine() {
|
||||
if (datetimeLine == null) {
|
||||
datetimeLine = DateUtil.format(datetime, dtFormat);
|
||||
|
||||
@@ -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<String> printWatermarkPUrlList = scenicConfig.getList("print_watermark_p_url", String.class);
|
||||
List<String> 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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user