From 04a0d21351ad8fd133c874711312fbbf5bbd695b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Fri, 11 Sep 2026 19:03:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=8E=9F=E5=A7=8B=20PNG=20?= =?UTF-8?q?=E7=9A=84=E9=87=8D=E5=A4=8D=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用解码后的颜色类型校验位深,将读取限制统一留在 image 解码器。 --- server-rs/crates/api-server/src/raw_image.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/server-rs/crates/api-server/src/raw_image.rs b/server-rs/crates/api-server/src/raw_image.rs index c8fab56e3..b8d58a2d2 100644 --- a/server-rs/crates/api-server/src/raw_image.rs +++ b/server-rs/crates/api-server/src/raw_image.rs @@ -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 {