feat(printer): 增加对source.type=3的特殊图片处理流程

- 新增ImageResizeStage、ImageSRStage和UpdateMemberPrintStage处理阶段
- 对type=3的图片增加超分辨率和图像增强处理
- 构建新的处理管线,包含下载、方向校正、超分、增强、上传等12个阶段
- 兼容旧版URL处理逻辑,针对type=3替换缩略图为原图URL
- 优化图片来源判断逻辑,增加source实体查询
- 完善处理日志记录和阶段状态控制
This commit is contained in:
2025-12-06 22:27:48 +08:00
parent 9321422e56
commit 9f5a61247b

View File

@@ -14,8 +14,11 @@ import com.ycwl.basic.image.pipeline.stages.ConditionalRotateStage;
import com.ycwl.basic.image.pipeline.stages.DownloadStage;
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;
import com.ycwl.basic.image.pipeline.stages.WatermarkConfig;
import com.ycwl.basic.image.pipeline.stages.WatermarkStage;
@@ -519,6 +522,10 @@ public class PrinterServiceImpl implements PrinterService {
}
String url = byId.getUrl();
// 特殊兼容处理
if (Integer.valueOf(3).equals(byId.getType())) {
url = byId.getThumbUrl().replace("_t.", "_o.");
}
MemberPrintEntity entity = new MemberPrintEntity();
entity.setMemberId(memberId);
entity.setScenicId(scenicId);
@@ -788,6 +795,7 @@ public class PrinterServiceImpl implements PrinterService {
.addStage(new ImageOrientationStage())
.addStage(new ConditionalRotateStage())
.addStage(new ImageEnhanceStage(config)) // 通过setStageState方法设置是否启用
.addStage(new ImageResizeStage(2.0 / 3.0)) // 缩小2/3倍(回到原分辨率)
.addStage(new WatermarkStage(watermarkConfig))
.addStage(new RestoreOrientationStage())
.addStage(new UploadStage())
@@ -827,11 +835,10 @@ public class PrinterServiceImpl implements PrinterService {
// 设置管线场景为图片打印
context.setScene(PipelineScene.IMAGE_PRINT);
// 根据sourceId判断图片来源
// sourceId > 0: IPC设备拍摄
// sourceId == null: 手机上传
// sourceId == 0: 拼图(暂定为UNKNOWN)
// 根据sourceId判断图片来源和source类型
SourceEntity source = null;
if (item.getSourceId() != null && item.getSourceId() > 0) {
source = sourceMapper.getEntity(item.getSourceId());
context.setSource(ImageSource.IPC);
} else if (item.getSourceId() == null) {
context.setSource(ImageSource.PHONE);
@@ -840,15 +847,50 @@ public class PrinterServiceImpl implements PrinterService {
}
Pipeline<PhotoProcessContext> pipeline;
if (context.getImageType() == ImageType.NORMAL_PHOTO) {
// 特殊处理: sourceId > 0 且 source.type == 3
if (source != null && source.getType() != null && source.getType() == 3) {
// Type=3的特殊处理流程
log.info("检测到source.type=3, 使用特殊处理管线: sourceId={}", item.getSourceId());
// 准备百度云配置
BceEnhancerConfig bceConfig = new BceEnhancerConfig();
bceConfig.setQps(1);
bceConfig.setAppId("119554288");
bceConfig.setApiKey("OX6QoijgKio3eVtA0PiUVf7f");
bceConfig.setSecretKey("dYatXReVriPeiktTjUblhfubpcmYfuMk");
// 准备水印配置
WatermarkConfig watermarkConfig = prepareWatermarkConfig(context, qrCodeFile);
// 准备存储适配器
prepareStorageAdapter(context);
// 创建普通照片管线
context.enableStage("image_sr");
context.enableStage("image_enhance");
// 构建特殊管线: 放大1.5倍 -> 超分(2倍) -> 增强 -> 更新MemberPrint -> 缩小3倍 -> 水印 -> 上传
pipeline = new PipelineBuilder<PhotoProcessContext>("Type3Pipeline")
.addStage(new DownloadStage()) // 1. 下载图片
.addStage(new ImageOrientationStage()) // 2. 检测方向
.addStage(new ConditionalRotateStage()) // 3. 条件性旋转
.addStage(new ImageSRStage(bceConfig)) // 4. 超分辨率(2倍放大)
.addStage(new ImageEnhanceStage(bceConfig)) // 5. 图像增强
.addStage(new UploadStage()) // 6. 上传(用于更新MemberPrint)
.addStage(new UpdateMemberPrintStage(printerMapper, // 7. 更新MemberPrint的cropUrl
item.getId(), item.getMemberId(), scenicId))
.addStage(new ImageResizeStage(4.0 / 3.0)) // 8. 缩小3倍(回到原分辨率)
.addStage(new WatermarkStage(watermarkConfig)) // 9. 添加水印
.addStage(new RestoreOrientationStage()) // 10. 恢复方向
.addStage(new UploadStage()) // 11. 最终上传
.addStage(new CleanupStage()) // 12. 清理
.build();
} else if (context.getImageType() == ImageType.NORMAL_PHOTO) {
// 普通照片处理流程
WatermarkConfig watermarkConfig = prepareWatermarkConfig(context, qrCodeFile);
prepareStorageAdapter(context);
pipeline = createNormalPhotoPipeline(watermarkConfig);
} else {
// 拼图
// 拼图处理流程
prepareStorageAdapter(context);
pipeline = createPuzzlePipeline();
}