diff --git a/pom.xml b/pom.xml
index a58b9f42..ca9d9633 100644
--- a/pom.xml
+++ b/pom.xml
@@ -339,6 +339,27 @@
1.10.0
+
+
+
+ com.alibaba
+ dashscope-sdk-java
+ 2.20.1
+
+
+
+
+ org.bytedeco
+ javacv-platform
+ 1.5.9
+
+
+
+
+ com.madgag
+ animated-gif-lib
+ 1.4
+
diff --git a/src/main/java/com/ai/da/common/utils/MinioUtil.java b/src/main/java/com/ai/da/common/utils/MinioUtil.java
index d67c9ab8..de9e423b 100644
--- a/src/main/java/com/ai/da/common/utils/MinioUtil.java
+++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java
@@ -3,13 +3,14 @@ package com.ai.da.common.utils;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.mapper.primary.entity.ObjectItem;
import io.minio.*;
-import io.minio.errors.MinioException;
+import io.minio.errors.*;
import io.minio.http.Method;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
import io.minio.messages.Item;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@@ -617,6 +618,59 @@ public class MinioUtil {
}
}
+ public String getImageAsBase64(String path) throws IOException {
+ int index = path.indexOf("/");
+ String bucketName = path.substring(0, index);
+ String fileName = path.substring(index + 1);
+
+ // 检查桶是否存在
+ boolean found = doesObjectExist(bucketName, fileName);
+ if (!found) {
+ throw new IOException("Bucket " + bucketName + " does not exist");
+ }
+
+ try (InputStream stream = minioClient.getObject(
+ GetObjectArgs.builder()
+ .bucket(bucketName)
+ .object(fileName)
+ .build())) {
+
+ byte[] bytes = IOUtils.toByteArray(stream);
+ return Base64.getEncoder().encodeToString(bytes);
+ } catch (ServerException e) {
+ throw new RuntimeException(e);
+ } catch (InsufficientDataException e) {
+ throw new RuntimeException(e);
+ } catch (ErrorResponseException e) {
+ throw new RuntimeException(e);
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ } catch (InvalidKeyException e) {
+ throw new RuntimeException(e);
+ } catch (InvalidResponseException e) {
+ throw new RuntimeException(e);
+ } catch (XmlParserException e) {
+ throw new RuntimeException(e);
+ } catch (InternalException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void uploadToMinio(byte[] data, String bucket, String objectName, String contentType) /*throws Exception*/ {
+ try {
+ minioClient.putObject(PutObjectArgs.builder()
+ .bucket(bucket)
+ .object(objectName)
+ .stream(new ByteArrayInputStream(data), data.length, -1)
+ .contentType(contentType)
+ .build());
+ } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e){
+ log.error("图片上传到minio出错,{}", e.getMessage());
+ throw new BusinessException("file upload exception");
+ }
+ }
+
+
}
diff --git a/src/main/java/com/ai/da/common/utils/RedisUtil.java b/src/main/java/com/ai/da/common/utils/RedisUtil.java
index e65366ee..72d70588 100644
--- a/src/main/java/com/ai/da/common/utils/RedisUtil.java
+++ b/src/main/java/com/ai/da/common/utils/RedisUtil.java
@@ -498,6 +498,8 @@ public class RedisUtil {
public final static String STRIPE_EXCEPTION_LOG = "StripeException:";
+ public final static String ANIMATE_ANYONE_TEMPLATE_ID = "AnimateAnyoneTemplateId:";
+
public void batchDeleteKeysWithSamePrefix(String prefix){
Set keys = redisTemplate.keys(prefix + "*");
assert keys != null;
diff --git a/src/main/java/com/ai/da/common/utils/SendRequestUtil.java b/src/main/java/com/ai/da/common/utils/SendRequestUtil.java
new file mode 100644
index 00000000..173c2b30
--- /dev/null
+++ b/src/main/java/com/ai/da/common/utils/SendRequestUtil.java
@@ -0,0 +1,92 @@
+package com.ai.da.common.utils;
+
+import cn.hutool.http.Header;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class SendRequestUtil {
+
+ @Value("${ALIYUN_API_KEY}")
+ private String AliYunAPIKey;
+ @Value("${FREEPIK_API_KEY}")
+ private String freepikAPIKey;
+
+ public String sendAliYunPostAsync(String apiUrl, String requestBody){
+ // 发送POST请求 todo 异常处理
+ HttpResponse execute = HttpRequest.post(apiUrl)
+ .header(Header.AUTHORIZATION, "Bearer " + AliYunAPIKey)
+ .header("X-DashScope-Async", "enable")
+ .header(Header.CONTENT_TYPE, "application/json")
+ .body(requestBody)
+ .timeout(20000) // 设置超时时间20秒
+ .execute();
+ int status = execute.getStatus();
+ if (status == 200){
+ String body = execute.body();
+ JSONObject bodyJson = JSONUtil.parseObj(body);
+ return body;
+ }
+ log.warn("请求失败,状态码为 : {}", status);
+ return null;
+ }
+
+ public static final String FREE_PIK = "https://api.freepik.com/v1/ai/beta/text-to-image/reimagine-flux";
+ public String sendFreepikPost( String requestBody){
+ // 发送POST请求 todo 异常处理
+ HttpResponse execute = HttpRequest.post(FREE_PIK)
+ .header(Header.CONTENT_TYPE, "application/json")
+ .header("x-freepik-api-key", freepikAPIKey)
+ .body(requestBody)
+ .timeout(20000) // 设置超时时间20秒
+ .execute();
+ int status = execute.getStatus();
+ if (status == 200){
+ return execute.body();
+ }
+ log.warn("请求失败,状态码为 : {}", status);
+ return null;
+ }
+
+ public String sendAliYunGet(String fullUrl){
+ // 发送GET请求 todo 异常处理
+ HttpResponse httpResponse = HttpRequest.get(fullUrl)
+ .header(Header.AUTHORIZATION, "Bearer " + AliYunAPIKey)
+ .timeout(20000) // 设置超时时间20秒
+ .execute();
+ int status = httpResponse.getStatus();
+ if (status == 200){
+ return httpResponse.body();
+ }else {
+ return null;
+ }
+ }
+
+ public String sendPost(String url, String requestBodyStr){
+ int status;
+ String body;
+ try (HttpResponse execute = HttpRequest.post(url)
+ .header("Content-Type", "application/json") // 必须设置 Content-Type
+ .body(requestBodyStr) // Hutool 会自动处理 JSON 序列化
+ .timeout(120000) // 设置超时(毫秒)
+ .execute()) {
+
+ status = execute.getStatus();
+ body = execute.body();
+ if (status == 200) {
+ return body;
+ }
+ }
+ log.warn("请求失败,状态码为 : {}, body: {}", status, body);
+ return null;
+ }
+
+
+
+}
diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java
index d6acff79..1f9fb27d 100644
--- a/src/main/java/com/ai/da/controller/GenerateController.java
+++ b/src/main/java/com/ai/da/controller/GenerateController.java
@@ -9,10 +9,10 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.validation.Valid;
+import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -98,16 +98,14 @@ public class GenerateController {
}
@ApiOperation(value = "请求进行姿势变换")
- @GetMapping("/poseTransform")
- public Response poseTransform(@ApiParam("projectId") @RequestParam Long projectId,
- @ApiParam("productImage") @RequestParam String productImage,
- @ApiParam("poseId") @RequestParam int poseId) {
- return Response.success(generateService.poseTransform(projectId, productImage, poseId));
+ @PostMapping("/poseTransform")
+ public Response poseTransform(@Valid @RequestBody PoseTransformDTO poseTransformDTO) {
+ return Response.success(generateService.poseTransform(poseTransformDTO));
}
@ApiOperation(value = "获取姿势变换生成结果")
- @GetMapping("/poseTransformResult")
- public Response getPoseTransformationResults(@ApiParam("taskId") @RequestParam String taskId) {
+ @PostMapping("/poseTransformResult")
+ public Response getPoseTransformationResults(@RequestParam String taskId) {
PoseTransformationVO generateResult = generateService.getPoseTransformationResult(taskId);
return Response.success(generateResult);
}
@@ -145,6 +143,52 @@ public class GenerateController {
return Response.success(generateService.getAllPose());
}
+ /*@ApiOperation(value = "万象 t2i 创建异步任务")
+ @GetMapping("/createAsyncTask")
+ public Response createAsyncTask(@RequestParam("prompt") String prompt){
+ return Response.success(generateService.createAsyncTask(87L, prompt, ""));
+ }
+
+ @ApiOperation(value = "万象 t2i 获取异步任务结果")
+ @GetMapping("/waitAsyncTask")
+ public Response waitAsyncTask(@RequestParam("taskId") String taskId){
+ return Response.success(generateService.getAsyncTaskResult(taskId));
+ }
+
+ @ApiOperation(value = "万象 图生动图")
+ @GetMapping("/animateAnyone")
+ public Response animateAnyone(@Valid @RequestBody PoseTransformDTO poseTransformDTO){
+ return Response.success(generateService.animateAnyone(poseTransformDTO, null));
+ }
+
+ @ApiOperation(value = "万象 获取动图模板id")
+ @GetMapping("/getVideoTemplateId")
+ public Response getVideoTemplateId(@RequestParam("videoPath") String videoPath){
+ return Response.success(generateService.getVideoTemplateId(videoPath));
+ }
+
+ @ApiOperation(value = "万象 获取动图结果")
+ @GetMapping("/getAnimateResult")
+ public Response getAnimateResult(@RequestParam("taskId") String taskId){
+ return Response.success(generateService.getAnimateResult(taskId));
+ }*/
+
+ @ApiOperation(value = "freepik toProductImage")
+ @GetMapping("/reimagineFreePik")
+ public Response reimagineFreePik(@RequestParam("path") String path,
+ @RequestParam("prompt") String prompt,
+ @RequestParam("style") String style) throws IOException {
+ return Response.success(generateService.reimagineFreePik(path, prompt, style));
+ }
+
+ @ApiOperation(value = "获取图片描述")
+ @GetMapping("/getImageDescription")
+ public Response getImageDescription(@RequestParam("path") String path) {
+ return Response.success(generateService.getImageDescription(path));
+ }
+
+
+
}
diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Generate.java b/src/main/java/com/ai/da/mapper/primary/entity/Generate.java
index ef5f6809..cd0e3743 100644
--- a/src/main/java/com/ai/da/mapper/primary/entity/Generate.java
+++ b/src/main/java/com/ai/da/mapper/primary/entity/Generate.java
@@ -104,4 +104,16 @@ public class Generate {
*/
private Date updateDate;
+ public Generate() {
+ }
+
+ public Generate(Long accountId, String uniqueId, String level1Type, String text, String generateType, String modelName, Date createDate) {
+ this.accountId = accountId;
+ this.uniqueId = uniqueId;
+ this.level1Type = level1Type;
+ this.text = text;
+ this.generateType = generateType;
+ this.modelName = modelName;
+ this.createDate = createDate;
+ }
}
diff --git a/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java b/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java
index cf52a849..cf385bdc 100644
--- a/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java
+++ b/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java
@@ -31,5 +31,14 @@ public class PoseTransformation extends BaseEntity {
private byte isDeleted;
+ public PoseTransformation() {
+ }
+ public PoseTransformation(Long projectId, Long accountId, String uniqueId, String productImage, int poseId) {
+ this.projectId = projectId;
+ this.accountId = accountId;
+ this.uniqueId = uniqueId;
+ this.productImage = productImage;
+ this.poseId = poseId;
+ }
}
diff --git a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java
index 772cb8cf..19266a53 100644
--- a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java
+++ b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java
@@ -39,8 +39,8 @@ public class GenerateThroughImageTextDTO {
private String gender;
- @ApiModelProperty("选择的模型名 high || fast")
- private String version;
+ @ApiModelProperty("选择的模型名 high || fast || wx || fp")
+ private String modelName;
@NotBlank(message = "timeZone cannot be empty!")
@ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取")
diff --git a/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java b/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java
new file mode 100644
index 00000000..dbe44803
--- /dev/null
+++ b/src/main/java/com/ai/da/model/dto/PoseTransformDTO.java
@@ -0,0 +1,24 @@
+package com.ai.da.model.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class PoseTransformDTO {
+ @ApiModelProperty("项目id")
+ private Long projectId;
+
+ @ApiModelProperty("图片的minio地址")
+ @NotBlank(message = "please select a product image")
+ private String productImage;
+
+ @ApiModelProperty("pose的编号")
+ @NotNull(message = "please select a pose")
+ private Integer poseId;
+
+ private String modelName;
+}
diff --git a/src/main/java/com/ai/da/model/vo/GenerateResultVO.java b/src/main/java/com/ai/da/model/vo/GenerateResultVO.java
index 4c82f674..1865cf1a 100644
--- a/src/main/java/com/ai/da/model/vo/GenerateResultVO.java
+++ b/src/main/java/com/ai/da/model/vo/GenerateResultVO.java
@@ -17,6 +17,7 @@ public class GenerateResultVO {
private String url;
+ // Success || Executing || Invalid || Failed
private String status;
private String category;
diff --git a/src/main/java/com/ai/da/model/vo/PoseTransformationVO.java b/src/main/java/com/ai/da/model/vo/PoseTransformationVO.java
index ad4a0cfd..3ff6be8a 100644
--- a/src/main/java/com/ai/da/model/vo/PoseTransformationVO.java
+++ b/src/main/java/com/ai/da/model/vo/PoseTransformationVO.java
@@ -23,6 +23,7 @@ public class PoseTransformationVO implements AllCollectionVO{
private byte isLiked;
+ // Success || Executing || Invalid || Failed
private String status;
private String collectionType;
diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java
index dde44c59..94d53d87 100644
--- a/src/main/java/com/ai/da/service/GenerateService.java
+++ b/src/main/java/com/ai/da/service/GenerateService.java
@@ -5,8 +5,8 @@ import com.ai.da.mapper.primary.entity.GenerateDetail;
import com.ai.da.model.dto.*;
import com.ai.da.model.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;
-import org.springframework.web.multipart.MultipartFile;
+import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -46,7 +46,7 @@ public interface GenerateService extends IService {
GenerateResultVO modifySketch(GenerateModifyDTO generateModifyDTO);
- String poseTransform(Long projectId, String productImage, int poseId);
+ String poseTransform(PoseTransformDTO poseTransformDTO);
void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl);
@@ -65,4 +65,18 @@ public interface GenerateService extends IService {
List