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,22 +98,36 @@ 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? // In bKGD 16-bit values are used even for 8-bit images
return None; Some(RGBA8::new(
} bkgd_header[1],
// In bKGD 16-bit values are used even for 8-bit images bkgd_header[3],
let bg = RGBA8::new(bkgd_header[1], bkgd_header[3], bkgd_header[5], 255); bkgd_header[5],
let entry = if let Some(&entry) = palette.get(&bg) { 255,
entry ))
} else if palette.len() < 256 { } else if png.ihdr.color_type == ColorType::GrayscaleAlpha && bkgd_header.len() == 2 {
let entry = palette.len() as u8; Some(RGBA8::new(
palette.insert(bg, entry); bkgd_header[1],
entry bkgd_header[1],
bkgd_header[1],
255,
))
} else { } else {
return None; // No space in palette to store the bg as an index None
}; };
aux_headers.insert(*b"bKGD", vec![entry]); if let Some(bg) = bg {
let entry = if let Some(&entry) = palette.get(&bg) {
entry
} else if palette.len() < 256 {
let entry = palette.len() as u8;
palette.insert(bg, entry);
entry
} else {
return None; // No space in palette to store the bg as an index
};
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") {

View file

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