Fix bKGD conversion from gray to palette

This commit is contained in:
Andrew 2023-05-03 21:47:08 +12:00
parent a26d225d81
commit d6cc8a003b
2 changed files with 29 additions and 15 deletions

View file

@ -98,12 +98,25 @@ pub fn reduce_to_palette(png: &PngImage) -> Option<PngImage> {
let mut aux_headers = png.aux_headers.clone(); let mut aux_headers = png.aux_headers.clone();
if let Some(bkgd_header) = png.aux_headers.get(b"bKGD") { if let Some(bkgd_header) = png.aux_headers.get(b"bKGD") {
if bkgd_header.len() != 6 { let bg = if png.ihdr.color_type.is_rgb() && bkgd_header.len() == 6 {
// malformed chunk?
return None;
}
// In bKGD 16-bit values are used even for 8-bit images // In bKGD 16-bit values are used even for 8-bit images
let bg = RGBA8::new(bkgd_header[1], bkgd_header[3], bkgd_header[5], 255); Some(RGBA8::new(
bkgd_header[1],
bkgd_header[3],
bkgd_header[5],
255,
))
} else if png.ihdr.color_type == ColorType::GrayscaleAlpha && bkgd_header.len() == 2 {
Some(RGBA8::new(
bkgd_header[1],
bkgd_header[1],
bkgd_header[1],
255,
))
} else {
None
};
if let Some(bg) = bg {
let entry = if let Some(&entry) = palette.get(&bg) { let entry = if let Some(&entry) = palette.get(&bg) {
entry entry
} else if palette.len() < 256 { } else if palette.len() < 256 {
@ -115,6 +128,7 @@ pub fn reduce_to_palette(png: &PngImage) -> Option<PngImage> {
}; };
aux_headers.insert(*b"bKGD", vec![entry]); aux_headers.insert(*b"bKGD", vec![entry]);
} }
}
if let Some(sbit_header) = png.aux_headers.get(b"sBIT") { if let Some(sbit_header) = png.aux_headers.get(b"sBIT") {
// Some programs save the sBIT header as RGB even if the image is RGBA. // Some programs save the sBIT header as RGB even if the image is RGBA.

View file

@ -243,7 +243,7 @@ fn issue_60() {
None, None,
RGBA, RGBA,
BitDepth::Eight, BitDepth::Eight,
GRAYSCALE_ALPHA, RGBA,
BitDepth::Eight, BitDepth::Eight,
); );
} }