适配 UI 分离图片编辑 multipart 接口
将标记图 data URL 解码为 PNG 文件部件。 按 Raw GPT Image 2 新合同发送 prompt、尺寸和输出参数。 保留响应 data[].b64_json 解析与 separation 流程不变。
This commit is contained in:
@@ -154,6 +154,15 @@ async fn raw_image_edit(
|
|||||||
.strip_prefix("data:")
|
.strip_prefix("data:")
|
||||||
.and_then(|v| v.strip_suffix(";base64"))
|
.and_then(|v| v.strip_suffix(";base64"))
|
||||||
.unwrap_or("image/png");
|
.unwrap_or("image/png");
|
||||||
|
if !mime.eq_ignore_ascii_case("image/png") {
|
||||||
|
return Err("图片分离请求只支持 PNG 标记图".to_string());
|
||||||
|
}
|
||||||
|
let image_bytes = base64::engine::general_purpose::STANDARD
|
||||||
|
.decode(data.trim())
|
||||||
|
.map_err(|error| format!("解码标记图失败:{error}"))?;
|
||||||
|
if image_bytes.is_empty() {
|
||||||
|
return Err("标记图不能为空".to_string());
|
||||||
|
}
|
||||||
let client = crate::http_client::agc_main_site_client_builder()
|
let client = crate::http_client::agc_main_site_client_builder()
|
||||||
.build()
|
.build()
|
||||||
.map_err(|e| format!("创建图片编辑客户端失败:{e}"))?;
|
.map_err(|e| format!("创建图片编辑客户端失败:{e}"))?;
|
||||||
@@ -161,19 +170,22 @@ async fn raw_image_edit(
|
|||||||
"{}/api/raw/v1/images/edit",
|
"{}/api/raw/v1/images/edit",
|
||||||
session.api_base_url.trim_end_matches('/')
|
session.api_base_url.trim_end_matches('/')
|
||||||
);
|
);
|
||||||
let body = serde_json::json!({
|
let image_part = reqwest::multipart::Part::bytes(image_bytes)
|
||||||
"image": {"data": data, "mimeType": mime},
|
.file_name("image.png")
|
||||||
"prompt": prompt,
|
.mime_str("image/png")
|
||||||
"width": width,
|
.map_err(|error| format!("构造图片编辑文件部件失败:{error}"))?;
|
||||||
"height": height,
|
let body = reqwest::multipart::Form::new()
|
||||||
"output_format": "png",
|
.part("image", image_part)
|
||||||
"background": "transparent"
|
.text("prompt", prompt.to_string())
|
||||||
});
|
.text("width", width.to_string())
|
||||||
|
.text("height", height.to_string())
|
||||||
|
.text("output_format", "png")
|
||||||
|
.text("background", "transparent");
|
||||||
let response = crate::http_client::with_agc_main_site_marker(
|
let response = crate::http_client::with_agc_main_site_marker(
|
||||||
client
|
client
|
||||||
.post(url)
|
.post(url)
|
||||||
.bearer_auth(&session.access_token)
|
.bearer_auth(&session.access_token)
|
||||||
.json(&body),
|
.multipart(body),
|
||||||
)
|
)
|
||||||
.send()
|
.send()
|
||||||
.await
|
.await
|
||||||
|
|||||||
Reference in New Issue
Block a user