避免原始 PNG 的重复解析

使用解码后的颜色类型校验位深,将读取限制统一留在 image 解码器。
This commit is contained in:
2026-09-11 19:03:03 +08:00
parent a9358bf3ce
commit 04a0d21351
+10 -8
View File
@@ -374,18 +374,20 @@ fn decode_image(value: RawImageData, field: &str) -> Result<(ReferenceImage, u32
if reader.format() != Some(ImageFormat::Png) {
return Err(bad_request(format!("{field} 文件必须是有效 PNG 文件")));
}
let png_decoder = png::Decoder::new(Cursor::new(bytes.as_ref()));
let png_reader = png_decoder
.read_info()
.map_err(|_| bad_request(format!("{field} 文件必须是有效 PNG 文件")))?;
if png_reader.info().bit_depth != png::BitDepth::Eight {
let decoded = reader
.decode()
.map_err(|error| map_decode_image_error(field, error))?;
if matches!(
decoded.color(),
image::ColorType::Rgba16
| image::ColorType::Rgb16
| image::ColorType::L16
| image::ColorType::La16
) {
return Err(bad_request(format!(
"{field} 必须为 8-bit PNG(每通道 8 位)"
)));
}
let decoded = reader
.decode()
.map_err(|error| map_decode_image_error(field, error))?;
let (width, height) = decoded.dimensions();
Ok((
ReferenceImage {