避免原始 PNG 的重复解析
使用解码后的颜色类型校验位深,将读取限制统一留在 image 解码器。
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user