【智能協同云圖庫】智能協同云圖庫第八彈:基于阿里云百煉大模型—實現 AI 擴圖功能

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述


AI 擴圖功能


需求分析


隨著 AI 的高速發展,AI 幾乎可以應用到任何傳統業務中,增強應用的功能,帶給用戶更好的體驗。

對于圖庫網站來說,AI 也有非常多的應用空間,比如可以利用 AI 繪圖大模型來編輯圖片,實現擴圖、擦除補全、圖配文、去水印等功能。

image-20250728001442679

以 AI 擴圖功能為例,用戶可以選擇一張已上傳的圖片,通過 AI 編輯得到新的圖片,并根據情況自行選擇是否保存。

該功能不限制僅在空間內使用,公共圖庫也可以支持。


方案設計


1. AI 繪圖大模型選擇


AI繪圖大模型我們自己是搞不來的,可以選擇一個市面上支持AI繪圖的大模型。

選擇 AI 大模型時,我們最關注的應該是生成效果、生成速度還有價格了吧?當然,對我們學習來說,最關注的還是價格,畢竟繪畫大模型的費用不低。

國內的 AI 繪圖大模型比較推薦阿里云百煉,它是一站式的大模型開發及應用構建平臺,可以通過簡單的界面操作,在5分鐘內開發出一款大模型應用,并在線體驗效果。

image-20250728001824875


創建好應用后,利用官方提供的 API 或SDK,直接通過幾行代碼,就能在項目中使用大模型應用:

image-20250728001918755


通過閱讀 官方文檔,發現它是支持AI圖像編輯與生成功能的,包括 AI 擴圖,支持 HTTP 調用,符合我們的需求。

image-20250728001951264


在控制臺也能看到對應的圖像畫面擴展模型:

image-20250728002039144


百煉的大模型提供了新人免費額度,可以通過文檔或者點進大模型了解,對于學習用來說足夠了:

image-20250728002304218


經過測試,圖片生成效果、生成速度都是不錯的,因此,本項目將選用阿里云百煉實現AI擴圖功能。

image-20250728002330847


建議:之前沒接觸過類似 AI 大模型平臺的同學,先多利用網頁控制臺熟悉 AI 大模型的 Prompt,了解不同大模型的區別。

推薦學習網站:WaytoAGI-通往AGI之路,最好的 AI 知識庫和工具站


2. 調用方式


通過閱讀 AI 圖像擴展的官方文檔,我們發現,API 只支持異步方式調用。

image-20250729114000515


這是因為 AI 繪畫任務計算量大且耗時長,同步調用會導致服務器線程長時間被單個任務占用,限制了并發處理能力,增加了超時和系統崩潰的風險。

通過異步調用,服務器可以將任務放入隊列中,合理調度資源,避免阻塞主線程,從而更高效地服務多個用戶請求,提升整體系統的穩定性和可擴展性。

特點:客戶端可以直接獲取到結果,調用更方便。

image-20250728002700553


異步調用流程如下,客戶端需要在提交任務后,不斷輪詢請求,來檢查任務是否執行完成。

image-20250728002822635

由于 AI 接口已經選擇了異步調用,所以我們作為要調用 AI 接口的客戶端,要使用輪詢的方式來檢查任務狀態是否為“已完成”,如果完成了,才可以獲取到生成的圖片。

那么是前端輪詢還是后端輪詢呢?


前端輪詢

  • 流程:前端調用后端提交任務后得到任務 ID,然后通過定時器輪詢請求查詢任務狀態接口,直到任務完成或失敗。
  • 示例代碼:
// 提交任務
async function submitTask() {const response = await fetch('/api/createTask', { method: 'POST' });const { taskId } = await response.json();checkTaskStatus(taskId);
}// 調用submitTask();// 檢查任務狀態
async function checkTaskStatus(taskId) {const intervalId = setInterval(async () => {const response = await fetch(`/api/taskStatus?taskId=${taskId}`);const { status, result } = await response.json();if (status === 'success') {console.log('Task completed:', result);clearInterval(intervalId); // 停止輪詢} else if (status === 'failed') {console.error('Task failed');clearInterval(intervalId); // 停止輪詢}}, 2000); // 每隔 2 秒輪詢
}

后端輪詢

  • 流程:后端通過循環或定時任務檢測任務狀態,接口保持阻塞,直到任務完成或失敗,直接返回結果給前端。
  • 示例代碼:
@RestController
public class TaskController {@PostMapping("/createTask")public String createTask() {String taskId = taskService.submitTask();return taskId;}@GetMapping("/waitForTask")public ResponseEntity<String> waitForTask(@RequestParam String taskId) {while (true) {String status = taskService.checkTaskStatus(taskId);if ("success".equals(status)) {return ResponseEntity.ok("Task completed");} else if ("failed".equals(status)) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Task failed");}try {Thread.sleep(2000); // 等待 2 秒后重試} catch (InterruptedException e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error occurred");}}}
}
  • 后端輪詢問題:后端輪詢容易因為任務阻塞導致資源耗盡。
  • 推薦方案:通常推薦前端輪詢。除非有明確的需求要求時,才考慮后端輪詢,比如任務結果需實時返回且對網絡請求數敏感。(或者學習時不想寫前端的同學哈哈)
  • 選擇:此處我們也選擇前端輪詢方案實現。

💡 小貼士:從這個方案設計中,我們也能感受到,如果你同時了解前端和后端,可以結合二者設計出更合理的方案,而不是把所有的“重擔”都交給前端或者后端一方。所以企業中開需求評審會或者討論方案時,前后端需要緊密協作。


后端開發


1. AI 擴圖 API


(1) 創建 API Key

首先開發業務依賴的基礎能力,也就是 AI 擴圖 API。

1. 需要先進入阿里云百煉控制臺開通服務:

image-20250728003152739


2. 開通推理能力:

image-20250728003236041


3. 開通之后,我們要在控制臺獲取API Key,可參考文檔:

image-20250729141002688

開通之后,在控制臺獲取 API Key,可參考文檔。

能夠在控制臺查看到 API Key,注意,API Key 一定不要對外泄露!


接下來,我們需要根據下面的請求頭使用 Java 來構造擴圖請求實體類數據模型

image-20250729142258249


通過閱讀文檔發現,百煉支持通過 SDK 或 HTTP 調用。

雖然官方寫的支持 Java SDK,但 AI 擴圖功能中對 SDK 的介紹非常少,此處考慮到兼容性,我們還是使用 HTTP 調用。

image-20250728003431752


4. 由于使用異步的方式,需要開發創建任務和查詢結果 2 個 API。

image-20250728003448202


5. 填寫配置文件:在配置文件中填寫獲取到的 apiKey

image-20250729141541522

# 阿里云 AI 配置
aliYunAi:apiKey: xxxx

(2) 創建請求參數接收類

api 包下新建 aliyunai 包,存放阿里云 AI 相關代碼。

image-20250729141819566


aliyunai.model 包下新建數據模型類,可以讓 AI 根據官方文檔中的請求響應信息,自動生成請求實體類,無需自己手動編寫。

復制下面的請求體內容,交給 AI 生成:

image-20250729142511438


code is cheap, show me the talk !

image-20250729142914990


由于每個 AI 圖片處理操作的請求響應都有一些區別,所以單獨給 AI 擴圖功能編寫具體的請求響應類。創建擴圖任務請求類:

@Data
public class CreateOutPaintingTaskRequest implements Serializable {/*** 模型,例如 "image-out-painting"*/private String model = "image-out-painting";/*** 輸入圖像信息*/private Input input;/*** 圖像處理參數*/private Parameters parameters;@Datapublic static class Input {/*** 必選,圖像 URL*/@Alias("image_url")private String imageUrl;}@Datapublic static class Parameters implements Serializable {/*** 可選,逆時針旋轉角度,默認值 0,取值范圍 [0, 359]*/private Integer angle;/*** 可選,輸出圖像的寬高比,默認空字符串,不設置寬高比* 可選值:["", "1:1", "3:4", "4:3", "9:16", "16:9"]*/@Alias("output_ratio")private String outputRatio;/*** 可選,圖像居中,在水平方向上按比例擴展,默認值 1.0,范圍 [1.0, 3.0]*/@Alias("x_scale")@JsonProperty("xScale")private Float xScale;/*** 可選,圖像居中,在垂直方向上按比例擴展,默認值 1.0,范圍 [1.0, 3.0]*/@Alias("y_scale")@JsonProperty("yScale")private Float yScale;/*** 可選,在圖像上方添加像素,默認值 0*/@Alias("top_offset")private Integer topOffset;/*** 可選,在圖像下方添加像素,默認值 0*/@Alias("bottom_offset")private Integer bottomOffset;/*** 可選,在圖像左側添加像素,默認值 0*/@Alias("left_offset")private Integer leftOffset;/*** 可選,在圖像右側添加像素,默認值 0*/@Alias("right_offset")private Integer rightOffset;/*** 可選,開啟圖像最佳質量模式,默認值 false* 若為 true,耗時會成倍增加*/@Alias("best_quality")private Boolean bestQuality;/*** 可選,限制模型生成的圖像文件大小,默認值 true* - 單邊長度 <= 10000:輸出圖像文件大小限制為 5MB 以下* - 單邊長度 > 10000:輸出圖像文件大小限制為 10MB 以下*/@Alias("limit_image_size")private Boolean limitImageSize;/*** 可選,添加 "Generated by AI" 水印,默認值 true*/@Alias("add_watermark")private Boolean addWatermark = false;}
}

image-20250729144432756

注意:上述代碼中,某些字段打上了 Hutool 工具類的 @Alias 注解。這個注解僅對 Hutool 的 JSON 轉換生效,對 SpringMVC 的 JSON 轉換沒有任何影響。

  • 這里有一個很坑的地方,經過測試發現,前端如果傳遞參數名 xScale,是無法賦值給 xScale 字段的;但是傳遞參數名 xscale,就可以賦值。

  • 這是因為 SpringMVC 對于第二個字母是大寫的參數無法映射(和參數類別無關)。參考博客


解決方案:給這些字段增加 @JsonProperty 注解。

/*** 可選,圖像居中,在水平方向上按比例擴展,默認值 1.0,范圍 [1.0, 3.0]*/
@Alias("x_scale")
@JsonProperty("xScale")
private Float xScale;/*** 可選,圖像居中,在垂直方向上按比例擴展,默認值 1.0,范圍 [1.0, 3.0]*/
@Alias("y_scale")
@JsonProperty("yScale")
private Float yScale;

為什么 SpringMVC 要這樣設計,通過查閱了解到,這是因為 Jackson 在處理字段名與 JSON 屬性名映射時,會依賴 Java 的標準命名規范反射 API

  • 舉個例子,根據 JavaBean 的規范,屬性名稱與其訪問器方法(getter 和 setter)之間的映射規則是:如果屬性名以小寫字母開頭,第二個字母是大寫(如 eMail),規范仍認為屬性名稱是 eMail,而訪問器方法應為 geteMail()seteMail()
  • 但 Jackson 會嘗試推斷屬性名為 email(因為 eMail 不常見),從而導致 JSON 中 eMailemail 可能無法正確映射。

記住結論即可:SpringMVC 默認的序列化器 Jackson 在字段名的第二個字母為大寫時,無法正確映射;需要使用 @JsonProperty("yScale") 這樣的注解正確映射


(3) 創建擴圖任務響應類

image-20250729150247373

這個類同理,不要自己寫,直接使用 AI 生成:

image-20250729145538788

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CreateOutPaintingTaskResponse {private Output output;/*** 表示任務的輸出信息*/@Datapublic static class Output {/*** 任務 ID*/private String taskId;/*** 任務狀態* <ul>*     <li>PENDING:排隊中</li>*     <li>RUNNING:處理中</li>*     <li>SUSPENDED:掛起</li>*     <li>SUCCEEDED:執行成功</li>*     <li>FAILED:執行失敗</li>*     <li>UNKNOWN:任務不存在或狀態未知</li>* </ul>*/private String taskStatus;}/*** 接口錯誤碼。* <p>接口成功請求不會返回該參數。</p>*/private String code;/*** 接口錯誤信息。* <p>接口成功請求不會返回該參數。</p>*/private String message;/*** 請求唯一標識。* <p>可用于請求明細溯源和問題排查。</p>*/private String requestId;
}

(4) 查詢任務響應類

image-20250729150151780


根據官方文檔響應的說明,使用 AI 生成對應的查詢任務響應類

image-20250729150327051

@Data
@NoArgsConstructor
@AllArgsConstructor
public class GetOutPaintingTaskResponse {/*** 請求唯一標識*/private String requestId;/*** 輸出信息*/private Output output;/*** 表示任務的輸出信息*/@Datapublic static class Output {/*** 任務 ID*/private String taskId;/*** 任務狀態* <ul>*     <li>PENDING:排隊中</li>*     <li>RUNNING:處理中</li>*     <li>SUSPENDED:掛起</li>*     <li>SUCCEEDED:執行成功</li>*     <li>FAILED:執行失敗</li>*     <li>UNKNOWN:任務不存在或狀態未知</li>* </ul>*/private String taskStatus;/*** 提交時間* 格式:YYYY-MM-DD HH:mm:ss.SSS*/private String submitTime;/*** 調度時間* 格式:YYYY-MM-DD HH:mm:ss.SSS*/private String scheduledTime;/*** 結束時間* 格式:YYYY-MM-DD HH:mm:ss.SSS*/private String endTime;/*** 輸出圖像的 URL*/private String outputImageUrl;/*** 接口錯誤碼* <p>接口成功請求不會返回該參數</p>*/private String code;/*** 接口錯誤信息* <p>接口成功請求不會返回該參數</p>*/private String message;/*** 任務指標信息*/private TaskMetrics taskMetrics;}/*** 表示任務的統計信息*/@Datapublic static class TaskMetrics {/*** 總任務數*/private Integer total;/*** 成功任務數*/private Integer succeeded;/*** 失敗任務數*/private Integer failed;}
}

(5) 大模型調用API 開發

開發 API 調用類,通過 Hutool 的 HTTP 請求工具類來調用阿里云百煉的 API。

image-20250729151912615


注解3:創建任務的請求地址,在官方文檔中可以找到

image-20250729152744229


注解4:查詢任務狀態的請求地址,在官方文檔中同樣可以找到

image-20250729152657100


注解6:根據官方文檔填寫請求頭

image-20250729161231652


注解7:

image-20250729155943777


注解 11:填寫查詢任務需要發送的請求頭

image-20250729161502430


@Slf4j
@Component  // 1. 這個類需要讀取配置文件中的 APIKey
public class AliYunAiApi {// 2. 使用 @Value 注解 (必須是 Spring 包), 讀取需要的配置文件@Value("${aliYunAi.apiKey}")private String apiKey;// 3. 創建任務地址public static final String CREATE_OUT_PAINTING_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/out-painting";// 4. 查詢任務狀態  %s 用于替換實際任務的 {task_id}public static final String GET_OUT_PAINTING_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/tasks/%s";// 5. 創建任務public CreateOutPaintingTaskResponse createOutPaintingTask(CreateOutPaintingTaskRequest createOutPaintingTaskRequest){if(createOutPaintingTaskRequest == null){throw new BusinessException(ErrorCode.OPERATION_ERROR, "擴圖參數為空");}//        curl --location --request POST 'https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/out-painting' \
//        --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
//        --header 'X-DashScope-Async: enable' \
//        --header 'Content-Type: application/json' \
//        --data '{
//        "model": "image-out-painting",
//                "input": {
//            "image_url": "http://xxx/image.jpg"
//        },
//        "parameters":{
//            "angle": 45,
//                    "x_scale":1.5,
//                    "y_scale":1.5
//        }
//    }'// 6. 復制上述請求, 然后構造 HTTP 請求, 可以用 AI 生成HttpRequest httpRequest = HttpRequest.post(CREATE_OUT_PAINTING_TASK_URL)  // 注解 3 的創建請求地址.header("Authorization", "Bearer" + apiKey)  // 填充自定義 APIKey.header("X-DashScope-Async", "enable") // 讓用戶必需顯示開啟異步, 也方便后續擴展.header("Content-Type", "application/json").body(JSONUtil.toJsonStr(createOutPaintingTaskRequest));// 使用 Hutool 的 JSONUtil, 因為剛剛的請求使用了 @Alias// 7. 使用 try...with 方法釋放 httpRequest 的資源, 自動釋放資源的對象必須實現 AutoCloseable 接口try(HttpResponse httpResponse = httpRequest.execute()){// 8. 響應碼異常if(!httpResponse.isOk()){log.error("請求異常: {}", httpResponse.body());throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 擴圖失敗");}// 9. 將正常的響應體轉為 JSON 格式的創建請求的響應對象CreateOutPaintingTaskResponse createOutPaintingTaskResponse = JSONUtil.toBean(httpResponse.body(), CreateOutPaintingTaskResponse.class);// 10. 拿到響應對象后, 根據響應對象 code 是否有值, 進一步判斷擴圖是否成功if (createOutPaintingTaskResponse.getCode() != null){String errMessage = createOutPaintingTaskResponse.getMessage();log.error("請求異常: {}", errMessage);throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 擴圖失敗" + errMessage);}return createOutPaintingTaskResponse;}}/*** 查詢創建的任務** @param taskId 任務 ID* @return 查詢任務響應*/public GetOutPaintingTaskResponse getOutPaintingTask(String taskId){if(StrUtil.isBlank(taskId)){throw new BusinessException(ErrorCode.PARAMS_ERROR, "任務 ID 不能為空");}// 11. 填寫請求頭, 發送請求
//        --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
//        https://dashscope.aliyuncs.com/api/v1/tasks/86ecf553-d340-4e21-xxxxxxxxxString url = String.format(GET_OUT_PAINTING_TASK_URL , taskId); // 注解 4 查詢請求的 URL , "%s" 替換為 taskIdtry(HttpResponse httpResponse = HttpRequest.get(url).header("Authorization", "Bearer" + apiKey) .execute()){// 響應碼異常if(!httpResponse.isOk()){log.error("請求異常: {}", httpResponse.body());throw new BusinessException(ErrorCode.OPERATION_ERROR, "獲取任務結果失敗");}return JSONUtil.toBean(httpResponse.body(), GetOutPaintingTaskResponse.class);}}
}

注意:要按照官方文檔的要求給請求頭增加鑒權信息,拼接配置中寫好的 apiKey

image-20250729233240094


2. 開發擴圖 API 調用接口


(1) 數據模型開發

model.dto.picture 包下新建 AI 擴圖請求類,用于接受前端傳來的參數并傳遞給 Service 服務層。

image-20250729170415374


字段包括圖片 id 和擴圖參數:

@Data
public class CreatePictureOutPaintingTaskRequest implements Serializable {/*** 圖片 id*/private Long pictureId;/*** 擴圖參數*/private CreateOutPaintingTaskRequest.Parameters parameters;private static final long serialVersionUID = 1L;
}

我們只需要傳一個已有的圖片,即可實現擴圖功能,具體流程:

  1. 前端構造 Parameters(內部類) 的各個參數,并與圖片 ID 一起構造擴圖請求;
  2. 前端向后端發送擴圖請求
  3. 后端從請求中解析圖片 ID圖像處理參數 Parameters
  4. 查詢數據庫,找到圖片 ID 對應的圖片,并進行關于圖片與空間的鑒權
  5. 圖片的 URLParameters 作為參數,構造API 擴圖請求,調用擴圖 API;
  6. 擴圖 API 解析請求,校驗參數,創建擴圖任務;
  7. 創建的擴圖任務,放入大模型擴圖任務隊列中,并生成對應的 taskId 返回;
  8. 可以通過調用查看進度 API ,查看對應 taskId 對應的生成進度
  9. 擴圖成功后,查看進度 API 會封裝URL 到響應中,返回給前端;

(2) 擴圖服務開發

在圖片服務中編寫創建擴圖任務方法,從數據庫中獲取圖片信息和 URL 地址,構造請求參數后調用 API 創建擴圖任務

注意,如果圖片有空間 id,則需要校驗權限,直接復用以前的權限校驗方法。

在這里插入圖片描述

@Override
public void checkPictureAuth(User loginUser, Picture picture) {Long spaceId = picture.getSpaceId();Long loginUserId = loginUser.getId();if (spaceId == null) {// 公共圖庫, 僅本人和管理員可操作if (!picture.getUserId().equals(loginUserId) && !userService.isAdmin(loginUser)) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}} else {// 私有空間, 僅空間管理員可操作if (!picture.getUserId().equals(loginUserId)) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}}
}

在調用大模型接口前,先調用該方法,對圖片進行鑒權,只有空間管理員,可以對圖片調用擴圖 API


接下來,我們對調用大模型 API 進行服務開發:

image-20250729171157489


/*** 創建擴圖任務* @param createPictureOutPaintingTaskRequest  擴圖請求* @param loginUser* @return*/
CreateOutPaintingTaskResponse createPictureOutPaintingTask(CreatePictureOutPaintingTaskRequest createPictureOutPaintingTaskRequest, User loginUser);

@Resource
private AliYunAiApi aliYunAiApi;@Override
public CreateOutPaintingTaskResponse createPictureOutPaintingTask(CreatePictureOutPaintingTaskRequest createPictureOutPaintingTaskRequest, User loginUser) {// 1. 根據請求獲取圖片 IDLong pictureId = createPictureOutPaintingTaskRequest.getPictureId();// 2. 查詢數據庫, 獲取圖片, 如果數據庫沒有該圖片, 拋異常
//        Picture picture = this.getById(pictureId);
//        ThrowUtils.throwIf(picture == null, ErrorCode.NOT_FOUND_ERROR, "圖片不存在");Picture picture = Optional.ofNullable(this.getById(pictureId)).orElseThrow(() -> new BusinessException(ErrorCode.NOT_FOUND_ERROR, "圖片不存在"));// Optional.ofNullable(...): 安全地包裝可能為 null 的查詢結果;// orElseThrow(...):如果結果確實為 null, 就立即拋出指定的異常;// 3. 校驗權限checkPictureAuth(loginUser, picture);// 4. 創建擴圖任務請求CreateOutPaintingTaskRequest createOutPaintingTaskRequest = new CreateOutPaintingTaskRequest();CreateOutPaintingTaskRequest.Input input = new CreateOutPaintingTaskRequest.Input();// 內部類 Input, 也作為參數input.setImageUrl(picture.getUrl());createOutPaintingTaskRequest.setInput(input);createOutPaintingTaskRequest.setParameters(createPictureOutPaintingTaskRequest.getParameters());// 5. 調用 API 創建任務return aliYunAiApi.createOutPaintingTask(createOutPaintingTaskRequest);
}

(3) 擴圖接口開發

PictureController 添加 AI 擴圖接口,包括創建任務和查詢任務狀態接口:

image-20250729180034566

/*** 創建 AI 擴圖任務*/
@PostMapping("/out_painting/create_task")
public BaseResponse<CreateOutPaintingTaskResponse> createPictureOutPaintingTask(@RequestBody CreatePictureOutPaintingTaskRequest createPictureOutPaintingTaskRequest,HttpServletRequest request) {if (createPictureOutPaintingTaskRequest == null || createPictureOutPaintingTaskRequest.getPictureId() == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}User loginUser = userService.getLoginUser(request);CreateOutPaintingTaskResponse response = pictureService.createPictureOutPaintingTask(createPictureOutPaintingTaskRequest, loginUser);return ResultUtils.success(response);
}

@Resource
private AliYunAiApi aliYunAiApi;/*** 查詢 AI 擴圖任務*/
@GetMapping("/out_painting/get_task")
public BaseResponse<GetOutPaintingTaskResponse> getPictureOutPaintingTask(String taskId) {ThrowUtils.throwIf(StrUtil.isBlank(taskId), ErrorCode.PARAMS_ERROR);GetOutPaintingTaskResponse task = aliYunAiApi.getOutPaintingTask(taskId);return ResultUtils.success(task);
}

(4) 接口測試

測試圖片:

image-20250729234703974


發送擴圖任務請求:

image-20250729234205880


響應:

image-20250729234244438


復制 taskId,調用查看任務接口:

image-20250729234337208


打開 outputImageUrl

image-20250729234445536


效果對比:

image-20250729234904886

至此,我們的 AI 圖片編輯后端開發完成啦~~~~


在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916775.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年Solar應急響應公益月賽-7月筆記ing

應急響應身為顏狗的我是真心覺得lovelymem的ui寫得~~~~【任務1】應急大師題目描述&#xff1a;請提交隱藏用戶的名稱&#xff1f;print打印注冊表&#xff0c;或者開啟環境是就有【任務4】應急大師題目描述&#xff1a;請提交黑客創建隱藏用戶的TargetSid&#xff08;目標賬戶安…

C++/CLI vs 標準 C++ vs C# 語法對照手冊

&#x1f680; C/CLI vs 標準 C vs C# 語法對照手冊&#x1f9e9; 核心類型系統對比 // 類型聲明語法對比 標準 C C/CLI C# ─────────────────────────────────────────────────…

倉庫管理系統-2-后端之基于繼承基類的方式實現增刪改查

文章目錄 1 數據庫表user 2 后端通用框架 2.1 User.java(實體類) 2.2 使用封裝的方法(繼承基類) 2.2.1 UserMapper.java(mapper接口) 2.2.2 UserService.java(service接口) 2.2.3 UserServiceImpl.java(service實現類) 2.2.4 UserController.java(控制器) 3 增刪改查(封裝的方法…

【el-table滾動事件】el-table表格滾動時,獲取可視窗口內的行數據

一個簡單的獲取內容的辦法 表格部分&#xff0c;主要是ref寫一下<el-table :data"tableData" ref"tableRef"> </el-table>進入頁面的時候綁定監聽 mounted(){ // 綁定滾動事件this.$nextTick(() > {const table this.$refs.tableRef;const…

OCR 賦能自動閱卷:讓評分更高效精準

考試閱卷中&#xff0c;OCR 技術正成為高效助手&#xff0c;尤其在客觀題和標準化答題場景中表現亮眼。將考生答題卡掃描后&#xff0c;OCR 能快速識別填涂的選項、手寫數字或特定符號&#xff0c;與標準答案比對后自動判分。相比人工閱卷&#xff0c;它能在短時間內完成成百上…

在docker中安裝frp實現內網穿透

服務端frps 1.首先在服務器端安裝frps docker pull snowdreamtech/frps2.本地創建frps的配置文件frps.ini [common] bind_port 7000 # frp 服務端控制端口 token xxxxx # 客戶端認證密鑰3.啟動frps docker run -d --name frps \ --network host \ --restartalwa…

電腦開機后網絡連接慢?

在數字化日益普及的今天&#xff0c;電腦已成為我們工作和生活中不可或缺的工具。但是&#xff0c;可能很多用戶都遇到過電腦開機后網絡連接慢的情況&#xff0c;這不僅影響了我們的工作效率&#xff0c;還極大降低了上網體驗。怎么解決該問題呢&#xff1f;本文分享的這5個方法…

一分鐘部署一個導航網站

先看效果1.部署教程 mkdir -p /home/ascendking/mysite cd /home/ascendking/mysite# 安裝 WebStack-Hugo 主題git clone https://gitee.com/WangZhe168_admin/WebStack-Hugo.git themes/WebStack-Hugo# 將 exampleSite 目錄下的文件復制到 hugo 站點根目錄 cd /home/ascendki…

Rust實現微積分與高等數學公式

基于Rust實現高等數學中微積分 以下是基于Rust實現高等數學中微積分相關公式的示例整理,涵蓋微分、積分、級數等常見計算場景。內容分為基礎公式和進階應用兩類,提供可直接運行的Rust代碼片段(需依賴num或nalgebra等庫)。 微分運算 導數的數值近似(前向差分) 適用于函…

Android 鍵盤

基礎知識1. 物理鍵盤&#xff08;Physical Keyboard&#xff09;定義物理鍵盤指的是設備上真實存在的、可以按壓的鍵盤。例如&#xff1a;早期的 Android 手機&#xff08;如黑莓、摩托羅拉 Milestone&#xff09;自帶的 QWERTY 鍵盤外接的藍牙/USB 鍵盤平板或 Chromebook 上的…

SuperClaude Framework 使用指南

SuperClaude Framework 使用指南SuperClaude Framework 是一個開源配置框架&#xff0c;將 Claude Code 從通用 AI 助手轉變為專業的上下文感知開發伙伴。該框架通過模板驅動架構應用軟件工程原理&#xff0c;為專業軟件開發工作流程提供了強大的增強功能。目前該項目處于 v3.0…

Ruby 發送郵件 - SMTP

Ruby 發送郵件 - SMTP 在互聯網的世界中,郵件服務已經成為我們日常生活中不可或缺的一部分。而在開發過程中,使用Ruby發送郵件是一項基本技能。SMTP(Simple Mail Transfer Protocol)是互聯網上用于發送電子郵件的標準協議。本文將詳細介紹如何在Ruby中使用SMTP發送郵件。 …

Docker運行Ollama

1.docker-compose啟動ollama 按照 ollama docker-compose配置說明 配置并啟動ollama容器&#xff0c;啟動成功后&#xff0c;瀏覽器訪問 http://localhost:11434 如果顯示如下即代表成功 如果你的服務器支持GPU&#xff0c;可添加GPU參數支持&#xff0c;參考&#xff1a;htt…

輕松管理 WebSocket 連接!easy-websocket-client

在前端開發中&#xff0c;WebSocket 是實現實時通信的核心技術&#xff0c;但原生 WebSocket 的連接管理&#xff08;如斷連重連、心跳維護、事件監聽&#xff09;往往需要編寫大量重復代碼。今天給大家分享一個好用的 WebSocket 連接管理庫 —— easy-websocket-client&#x…

人工智能賦能社會治理:深度解析與未來展望

一、核心應用場景與技術實現1. 公共安全&#xff1a;智能防控與風險預警技術應用&#xff1a;立體化治安防控&#xff1a;AI攝像頭集成人臉識別、行為分析、多目標追蹤技術&#xff0c;提升破案率與公共安全能力。例如&#xff0c;深圳某區通過AI系統使盜竊案件破案率提升40%。…

解決使用vscode連接服務器出現“正在下載 VS Code 服務器...”

# 解決使用vscode連接服務器出現“正在下載 VS Code 服務器...”## 首先在vscode的輸出中獲取 commit idtext [17:17:41.679] Using commit id "c306e94f98122556ca081f527b466015e1bc37b0" and quality "stable" for server 從上面的體制中可以看出&#…

React 項目中使用 Redux 實現公共狀態共享

在 React 項目中使用 Redux 實現公共下拉選狀態共享并通知各組件更新的完整方案如下&#xff1a;1. 安裝 Redux 必要依賴 npm install reduxjs/toolkit react-redux2. 創建 Redux Store 和 Slice store/selectSlice.js import { createSlice } from reduxjs/toolkit;const init…

徹底清理ArcGIS 10.2殘留的步驟

文章目錄前言一、徹底清理ArcGIS 10.2殘留的步驟總結前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、徹底清理ArcGIS 10.2殘留的步驟 &#x1f527; 徹底清理ArcGIS 10.2殘留的…

JDK主流版本及推薦版本

根據當前Java生態發展&#xff08;截至2025年7月&#xff09;&#xff0c;結合主流企業實踐、技術特性和支持周期&#xff0c;以下是JDK主流版本及推薦版本的詳細分析&#xff1a;&#x1f9e9; 一、主流JDK版本現狀??JDK 8 (LTS)????使用比例??&#xff1a;約30-35%&a…

如何從 Web2 轉型到 Web3

如何從 Web2 轉型到 Web3如何從 Web2 轉型到 Web3引言Web2 與 Web3 的核心差異轉型的實用步驟1. 打基礎&#xff1a;學區塊鏈和 Web3 概念2. 學核心技術棧&#xff1a;從 Solidity 到 dApp3. 重新設計產品&#xff1a;混合模式起步4. 應對坑&#xff1a;技術、監管和安全5. 建社…