diff --git a/src/codecs/tiff.rs b/src/codecs/tiff.rs index 49987934e6..c4f8db93a9 100644 --- a/src/codecs/tiff.rs +++ b/src/codecs/tiff.rs @@ -114,7 +114,6 @@ where (tiff::ColorType::Gray(1), Uint) => ColorType::L8, (tiff::ColorType::Gray(8), Uint) => ColorType::L8, (tiff::ColorType::Gray(16), Uint) => ColorType::L16, - (tiff::ColorType::Gray(32), IEEEFP) => ColorType::L32F, (tiff::ColorType::GrayA(8), Uint) => ColorType::La8, (tiff::ColorType::GrayA(16), Uint) => ColorType::La16, (tiff::ColorType::RGB(8), Uint) => ColorType::Rgb8, @@ -123,9 +122,13 @@ where (tiff::ColorType::RGBA(16), Uint) => ColorType::Rgba16, (tiff::ColorType::CMYK(8), Uint) => ColorType::Rgb8, (tiff::ColorType::CMYK(16), Uint) => ColorType::Rgb16, + (tiff::ColorType::YCbCr(8), Uint) => ColorType::Rgb8, + (tiff::ColorType::Gray(16), IEEEFP) => ColorType::L32F, + (tiff::ColorType::Gray(32), IEEEFP) => ColorType::L32F, + (tiff::ColorType::RGB(16), IEEEFP) => ColorType::Rgb32F, (tiff::ColorType::RGB(32), IEEEFP) => ColorType::Rgb32F, + (tiff::ColorType::RGBA(16), IEEEFP) => ColorType::Rgba32F, (tiff::ColorType::RGBA(32), IEEEFP) => ColorType::Rgba32F, - (tiff::ColorType::YCbCr(8), Uint) => ColorType::Rgb8, _ => { return Err(ImageError::Unsupported( UnsupportedError::from_format_and_kind( @@ -143,6 +146,9 @@ where (tiff::ColorType::CMYK(8), Uint) => ExtendedColorType::Cmyk8, (tiff::ColorType::CMYK(16), Uint) => ExtendedColorType::Cmyk16, (tiff::ColorType::YCbCr(8), Uint) => ExtendedColorType::YCbCr8, + (tiff::ColorType::Gray(16), IEEEFP) => ExtendedColorType::L16F, + (tiff::ColorType::RGB(16), IEEEFP) => ExtendedColorType::Rgb16F, + (tiff::ColorType::RGBA(16), IEEEFP) => ExtendedColorType::Rgba16F, _ => color_type.into(), }; @@ -518,6 +524,18 @@ impl ImageDecoder for TiffDecoder { ycbcr_to_rgb8(ycbcr, lr, lg, lb, out); } + DecodingResult::F16(v) + if matches!( + info.original_color_type, + ExtendedColorType::L16F + | ExtendedColorType::Rgb16F + | ExtendedColorType::Rgba16F + ) => + { + for (half, out) in v.iter().zip(buf.as_chunks_mut::<4>().0.iter_mut()) { + *out = half.to_f32().to_ne_bytes(); + } + } DecodingResult::U8(v) => { buf.copy_from_slice(v); } diff --git a/src/color.rs b/src/color.rs index 304a4330fd..6f048d4d16 100644 --- a/src/color.rs +++ b/src/color.rs @@ -153,7 +153,16 @@ pub enum ExtendedColorType { /// Pixel is 8-bit BGR with an alpha channel Bgra8, - // TODO f16 types? + // TODO: Should the new f16 types come after Ycbcr8 for serde backwards compatibility? + /// Pixel is 16-bit float luminance + L16F, + /// Pixel is 16-bit float luminance with an alpha channel + La16F, + /// Pixel is 16-bit float RGB + Rgb16F, + /// Pixel is 16-bit float RGBA + Rgba16F, + /// Pixel is 32-bit float luminance L32F, /// Pixel is 32-bit float luminance with an alpha channel @@ -191,6 +200,7 @@ impl ExtendedColorType { | ExtendedColorType::L4 | ExtendedColorType::L8 | ExtendedColorType::L16 + | ExtendedColorType::L16F | ExtendedColorType::L32F | ExtendedColorType::Unknown(_) => 1, ExtendedColorType::La1 @@ -198,6 +208,7 @@ impl ExtendedColorType { | ExtendedColorType::La4 | ExtendedColorType::La8 | ExtendedColorType::La16 + | ExtendedColorType::La16F | ExtendedColorType::La32F => 2, ExtendedColorType::Rgb1 | ExtendedColorType::Rgb2 @@ -205,6 +216,7 @@ impl ExtendedColorType { | ExtendedColorType::Rgb5x1 | ExtendedColorType::Rgb8 | ExtendedColorType::Rgb16 + | ExtendedColorType::Rgb16F | ExtendedColorType::Rgb32F | ExtendedColorType::YCbCr8 | ExtendedColorType::Bgr8 => 3, @@ -213,6 +225,7 @@ impl ExtendedColorType { | ExtendedColorType::Rgba4 | ExtendedColorType::Rgba8 | ExtendedColorType::Rgba16 + | ExtendedColorType::Rgba16F | ExtendedColorType::Rgba32F | ExtendedColorType::Bgra8 | ExtendedColorType::Cmyk8 @@ -246,6 +259,10 @@ impl ExtendedColorType { ExtendedColorType::La16 => 32, ExtendedColorType::Rgb16 => 48, ExtendedColorType::Rgba16 => 64, + ExtendedColorType::L16F => 16, + ExtendedColorType::La16F => 32, + ExtendedColorType::Rgb16F => 48, + ExtendedColorType::Rgba16F => 64, ExtendedColorType::L32F => 32, ExtendedColorType::La32F => 64, ExtendedColorType::Rgb32F => 96, diff --git a/tests/images/tiff/testsuite/random-fp16.tiff b/tests/images/tiff/testsuite/random-fp16.tiff new file mode 100644 index 0000000000..77b7a276c3 Binary files /dev/null and b/tests/images/tiff/testsuite/random-fp16.tiff differ diff --git a/tests/reference/tiff/testsuite/random-fp16.tiff.png b/tests/reference/tiff/testsuite/random-fp16.tiff.png new file mode 100644 index 0000000000..2c29bed232 Binary files /dev/null and b/tests/reference/tiff/testsuite/random-fp16.tiff.png differ