Fix bKGD conversion from gray to palette
This commit is contained in:
parent
a26d225d81
commit
d6cc8a003b
2 changed files with 29 additions and 15 deletions
|
|
@ -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") {
|
||||||
|
|
|
||||||
|
|
@ -243,7 +243,7 @@ fn issue_60() {
|
||||||
None,
|
None,
|
||||||
RGBA,
|
RGBA,
|
||||||
BitDepth::Eight,
|
BitDepth::Eight,
|
||||||
GRAYSCALE_ALPHA,
|
RGBA,
|
||||||
BitDepth::Eight,
|
BitDepth::Eight,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue