WIP: UI编辑器自动分图层切图标 #304

Draft
k88936 wants to merge 100 commits from feat/ui-editor-auto-seperation into master
Showing only changes of commit f7edc9d0ee - Show all commits
+31 -1
View File
@@ -243,7 +243,7 @@ fn decode_image(value: RawImageData, field: &str) -> Result<ReferenceImage, AppE
}
reader
.decode()
.map_err(|_| bad_request(format!("{field}.data 必须是有效 PNG 文件")))?;
.map_err(|error| map_decode_image_error(field, error))?;
Ok(ReferenceImage {
bytes,
file_name: format!("{field}.png"),
@@ -251,6 +251,16 @@ fn decode_image(value: RawImageData, field: &str) -> Result<ReferenceImage, AppE
})
}
fn map_decode_image_error(field: &str, error: image::ImageError) -> AppError {
let message = match error {
image::ImageError::Limits(_) => {
format!("{field}.data 超出 PNG 尺寸或解码资源上限(单边不超过 {RAW_IMAGE_MAX_EDGE}px")
}
_ => format!("{field}.data 必须是有效 PNG 文件"),
};
bad_request(message)
}
async fn raw_image_edit_price(state: &AppState, width: u32, height: u32) -> Result<u32, AppError> {
let tier = if width.max(height) > 1536 { "2K" } else { "1K" };
state
@@ -373,4 +383,24 @@ mod tests {
assert!(prepare_request(serde_json::from_value(payload).expect("request")).is_err());
}
}
#[test]
fn oversized_valid_png_reports_resource_limit() {
let payload = serde_json::json!({
"image": {
"data": encoded_png(RAW_IMAGE_MAX_EDGE + 1, 1),
"mimeType": "image/png"
},
"prompt": "edit",
"width": 1024,
"height": 1024
});
let parsed: RawImageEditRequest = serde_json::from_value(payload).expect("request");
let error = match prepare_request(parsed) {
Ok(_) => panic!("oversized PNG should fail"),
Err(error) => error,
};
assert!(format!("{error:?}").contains("超出 PNG 尺寸或解码资源上限"));
}
}