局部design

This commit is contained in:
2025-02-25 11:48:08 +08:00
parent e60c3d7aa3
commit cf38e7253f
10 changed files with 104 additions and 10 deletions

View File

@@ -80,4 +80,8 @@ public class CommonConstant {
public static final String TIME_FORMAT_MMM_dd_yyyy = "MMM. dd, yyyy";
public static final String AFFILIATE_LINK = "https://www.aida.com.hk?ref=";
public static final String PARTIAL_DESIGN_FILENAME = "PartialDesign";
}

View File

@@ -95,6 +95,11 @@ public class DesignItemDetail implements Serializable {
*/
private String undividedLayer;
/**
* 局部design 只会有一张图
*/
private String partialDesign;
/**
* 创建时间
*/

View File

@@ -65,4 +65,6 @@ public class DesignSingleItemDTO implements Serializable {
@ApiModelProperty("mask 的minio地址")
private String maskMinioUrl;
private PartialDesignDTO partialDesignDTO;
}

View File

@@ -0,0 +1,39 @@
package com.ai.da.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@NoArgsConstructor
public class PartialDesignDTO implements Serializable {
@ApiModelProperty("图片的minio地址")
private String partialDesignMinioPath;
@ApiModelProperty("图片网页访问地址")
private String partialDesignPath;
@ApiModelProperty("图片的base64格式")
private String partialDesignBase64;
@ApiModelProperty("图层信息")
private List<String> layers;
public PartialDesignDTO(String partialDesignMinioPath) {
this.partialDesignMinioPath = partialDesignMinioPath;
}
public PartialDesignDTO(String partialDesignMinioPath, List<String> layers) {
this.partialDesignMinioPath = partialDesignMinioPath;
this.layers = layers;
}
public PartialDesignDTO(String partialDesignMinioPath, String partialDesignPath) {
this.partialDesignMinioPath = partialDesignMinioPath;
this.partialDesignPath = partialDesignPath;
}
}

View File

@@ -2,6 +2,7 @@ package com.ai.da.model.vo;
import com.ai.da.mapper.primary.entity.Gradient;
import com.ai.da.model.dto.DesignSinglePrintDTO;
import com.ai.da.model.dto.PartialDesignDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -61,6 +62,9 @@ public class DesignItemClothesDetailVO {
@ApiModelProperty("未分割的图层")
private String undividedLayer;
@ApiModelProperty("局部design")
private PartialDesignDTO partialDesign;
public DesignItemClothesDetailVO() {
}

View File

@@ -2731,7 +2731,8 @@ public class PythonService {
minioPath,
gradientString,
/*designSingleItem.getMaskUrl()*/
null
null,
designSingleItem.getPartialDesignDTO().getPartialDesignMinioPath()
));
});

View File

@@ -87,6 +87,11 @@ public class DesignPythonItem {
*/
private String seg_mask_url;
/**
* 局部design
*/
private String partial_design;
public static List<String> OUTWEAR_DRESS_BLOUSE = Arrays.asList(CollectionLevel2TypeEnum.OUTWEAR.getRealName(),
CollectionLevel2TypeEnum.DRESS.getRealName(), CollectionLevel2TypeEnum.BLOUSE.getRealName());
@@ -140,7 +145,7 @@ public class DesignPythonItem {
public DesignPythonItem(String type, String path, String color, PrintToPython print, Long businessId,
Long image_id, List<Long> offset, Float[] resize_scale, Integer priority, String gradient,
String gradientString, String seg_mask_url) {
String gradientString, String seg_mask_url, String partial_design) {
this.type = type;
this.path = path;
this.color = color;
@@ -154,6 +159,7 @@ public class DesignPythonItem {
this.gradient = gradient;
this.gradientString = gradientString;
this.seg_mask_url = seg_mask_url;
this.partial_design = partial_design;
}
public DesignPythonItem(String type, String path, String color, PrintToPython print, String icon, Long businessId, Long image_id) {

View File

@@ -26,7 +26,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.google.common.collect.Lists;
import com.mysql.cj.util.StringUtils;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.SerializationUtils;
@@ -88,9 +87,10 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
@Value("${minio.bucketName.modifiedSketch}")
private String modifiedSketchBucket;
@Value("${minio.bucketName.clothing}")
private String clothingBucket;
@Value("${minio.bucketName.partialDesign}")
private String partialDesignBucket;
@Autowired
private RedisUtil redisUtil;
@@ -358,11 +358,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
}
designItemDetail.setIconPath(detail.getIcon());
designItemDetail.setUndividedLayer(categoryAndUndividedLayer.get(detail.getType().toLowerCase()));
// 印花存储在design_item_detail_print表中 这里还要存吗?
// DesignPythonItemPrint printObject = detail.getPrintToPython();
// designItemDetail.setPrintPath(Objects.isNull(printObject) ? "" : printObject.getPath());
// 当有多个印花后返回的printObject太长导致存储到数据库时报错
// designItemDetail.setPrintJson(JSON.toJSONString(printObject));
designItemDetail.setPartialDesign(detail.getPartial_design());
designItemDetails.add(designItemDetail);
});
// businessId 来自t_sys_file或者t_library
@@ -452,6 +448,11 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
log.info("set labelingMask为空便于日志打印");
i.setMaskUrl(null);
}
if (!Objects.isNull(i.getPartialDesignDTO()) &&
!StringUtil.isNullOrEmpty(i.getPartialDesignDTO().getPartialDesignBase64())){
log.info("set partialDesignBase64为空便于日志打印");
i.getPartialDesignDTO().setPartialDesignBase64(null);
}
});
log.info("designSingle request入参 ==> " + JSONObject.toJSONString(clone));
@@ -516,6 +517,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
// maskBase64ToPath(designSingleIncludeLayersDTO, setNull);
maskBase64ToPath(designSingleIncludeLayersDTO, Boolean.TRUE);
partialDesignBase64ToImage(designSingleIncludeLayersDTO, userId);
// 组装入参
DesignPythonObjects objects = pythonService.covertDesignSingleParam(
designSingleIncludeLayersDTO, design.getSingleOverall(),
@@ -556,7 +559,6 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
}
List<DesignPythonOutfitVO> detailsVO = new ArrayList<>();
tDesignPythonOutfitDetails.forEach(detail -> {
String type = detail.getImageCategory().split("_")[0];
detailsVO.add(designPythonOutfitDetailService.convertToDesignPythonOutfitVO(detail, null));
@@ -624,6 +626,31 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
});
}
private void partialDesignBase64ToImage(DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO, Long accountId){
designSingleIncludeLayersDTO.getDesignSingleItemDTOList().forEach(item -> {
PartialDesignDTO partialDesignDTO = item.getPartialDesignDTO();
if (!Objects.isNull(item.getPartialDesignDTO())
&& !StringUtil.isNullOrEmpty(item.getPartialDesignDTO().getPartialDesignBase64())){
String path ;
if (!StringUtil.isNullOrEmpty(partialDesignDTO.getPartialDesignMinioPath())){
String sourcePath = partialDesignDTO.getPartialDesignMinioPath();
path = sourcePath.substring(sourcePath.indexOf("/") + 1, sourcePath.lastIndexOf("."));
}else {
path = accountId + "/" + CommonConstant.PARTIAL_DESIGN_FILENAME + "/" + UUID.randomUUID();
}
// todo 将原图地址作为修改后的图片地址,放在不同的桶
String newPath = minioUtil.base64UploadToPath(partialDesignDTO.getPartialDesignBase64(), partialDesignBucket, path);
if (StringUtil.isNullOrEmpty(newPath)){
log.error("局部design图片上传失败");
throw new BusinessException("partial.design.failed");
}
item.getPartialDesignDTO().setPartialDesignMinioPath(newPath);
}else {
item.setPartialDesignDTO(new PartialDesignDTO(null));
}
});
}
@Override
public Map<String, String> setTypeAndUndividedLayer(JSONArray layers){
HashMap<String, String> categoryAndLayer = new HashMap<>();
@@ -761,6 +788,9 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
&& (flag ? Boolean.TRUE : singleItem.getPriority().equals(layers.getPriority())))
).collect(Collectors.toList()));
designItemClothesDetailVO.setGradient(singleItem.getGradient());
String partialDesignMinioPath = singleItem.getPartialDesignDTO().getPartialDesignMinioPath();
String preSignedUrl = StringUtil.isNullOrEmpty(partialDesignMinioPath) ? null : minioUtil.getPreSignedUrl(partialDesignMinioPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME, true);
designItemClothesDetailVO.setPartialDesign(new PartialDesignDTO(partialDesignMinioPath, preSignedUrl));
if (categoryAndUndividedLayer.containsKey(singleItem.getType().toLowerCase())) designItemClothesDetailVO.setUndividedLayer(minioUtil.getPreSignedUrl(categoryAndUndividedLayer.get(singleItem.getType().toLowerCase()), CommonConstant.MINIO_IMAGE_EXPIRE_TIME, true));
body.setLayersObject(layersObject.stream().filter(layers -> layers.getImageCategory().equals("body")).collect(Collectors.toList()));

View File

@@ -150,6 +150,7 @@ only.original.works.can.participate.in.the.event=Sorry, only original works can
remaining.credits.insufficient=Your remaining credits are insufficient for this generation. Please recharge.
you.haven't.subscribed.to.any.products.yet=You haven't subscribed to any products yet
generate.result.below.standard=The quality of the generated images currently falls below standard. Please consider adjusting your prompt and trying again.
partial.design.failed=Partial design failed, Please try again later.
# 可能会报异常
# Informative:

View File

@@ -130,6 +130,7 @@ the.workspace.lastIndex.not.found=未找到工作区的lastIndex。
gender.cannot.be.empty=性别不能为空。
image.synthesis.failed=图像合成失败。
priority.cannot.be.repeated=优先级不能重复。
image.modify.failed=图片修改失败,请稍后重试。
slogan.style.cannot.be.empty=标语风格文本不能为空。
slogan.image.cannot.be.empty=标语图片不能为空。
questionnaire.filled.out=您已填写过当前问卷。
@@ -145,6 +146,7 @@ only.original.works.can.participate.in.the.event=抱歉,只有原创作品能
remaining.credits.insufficient=您的剩余积分不够本次生成消耗,请充值
you.haven't.subscribed.to.any.products.yet=您还未订阅任何产品
generate.result.below.standard=当前生成的图像质量低于标准。请考虑调整您的提示词并再次尝试
partial.design.failed=局部设计失败。请稍后重试。
# 可能会报异常
# Informative: