Browse Source

Add support decoding for 16 bits per channel tiff's

pull/1652/head
Brian Popow 5 years ago
parent
commit
6281743b3b
  1. 10
      src/ImageSharp/Formats/Tiff/PhotometricInterpretation/TiffColorDecoderFactory{TPixel}.cs
  2. 5
      src/ImageSharp/Formats/Tiff/PhotometricInterpretation/TiffColorType.cs
  3. 7
      src/ImageSharp/Formats/Tiff/TiffBitsPerPixel.cs
  4. 4
      src/ImageSharp/Formats/Tiff/TiffDecoderOptionsParser.cs
  5. 1
      src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs
  6. 6
      tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs
  7. 1
      tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs
  8. 2
      tests/ImageSharp.Tests/TestImages.cs
  9. 3
      tests/Images/Input/Tiff/flower-rgb-contig-16.tiff
  10. 3
      tests/Images/Input/Tiff/flower-rgb-planar-16.tiff

10
src/ImageSharp/Formats/Tiff/PhotometricInterpretation/TiffColorDecoderFactory{TPixel}.cs

@ -117,6 +117,16 @@ namespace SixLabors.ImageSharp.Formats.Tiff.PhotometricInterpretation
DebugGuard.IsTrue(colorMap == null, "colorMap");
return new RgbTiffColor<TPixel>(bitsPerSample);
case TiffColorType.Rgb161616:
DebugGuard.IsTrue(
bitsPerSample.Length == 3
&& bitsPerSample[2] == 16
&& bitsPerSample[1] == 16
&& bitsPerSample[0] == 16,
"bitsPerSample");
DebugGuard.IsTrue(colorMap == null, "colorMap");
return new RgbTiffColor<TPixel>(bitsPerSample);
case TiffColorType.PaletteColor:
DebugGuard.NotNull(bitsPerSample, "bitsPerSample");
DebugGuard.NotNull(colorMap, "colorMap");

5
src/ImageSharp/Formats/Tiff/PhotometricInterpretation/TiffColorType.cs

@ -88,6 +88,11 @@ namespace SixLabors.ImageSharp.Formats.Tiff.PhotometricInterpretation
/// </summary>
Rgb141414,
/// <summary>
/// RGB color image with 16 bits for each channel.
/// </summary>
Rgb161616,
/// <summary>
/// RGB Full Color. Planar configuration of data.
/// </summary>

7
src/ImageSharp/Formats/Tiff/TiffBitsPerPixel.cs

@ -83,5 +83,12 @@ namespace SixLabors.ImageSharp.Formats.Tiff
/// Note: The TiffEncoder does not yet support 14 bits per color channel and will default to 24 bits per pixel instead.
/// </summary>
Bit42 = 42,
/// <summary>
/// 48 bits per pixel. 16 bit for each color channel.
///
/// Note: The TiffEncoder does not yet support 16 bits per color channel and will default to 24 bits per pixel instead.
/// </summary>
Bit48 = 48,
}
}

4
src/ImageSharp/Formats/Tiff/TiffDecoderOptionsParser.cs

@ -185,6 +185,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff
ushort bitsPerChannel = options.BitsPerSample[0];
switch (bitsPerChannel)
{
case 16:
options.ColorType = TiffColorType.Rgb161616;
break;
case 14:
options.ColorType = TiffColorType.Rgb141414;
break;

1
src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs

@ -327,6 +327,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
case TiffBitsPerPixel.Bit30:
case TiffBitsPerPixel.Bit36:
case TiffBitsPerPixel.Bit42:
case TiffBitsPerPixel.Bit48:
// Encoding not yet supported bits per pixel will default to 24 bits.
this.SetEncoderOptions(TiffBitsPerPixel.Bit24, TiffPhotometricInterpretation.Rgb, compression, TiffPredictor.None);
break;

6
tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs

@ -160,6 +160,12 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
public void TiffDecoder_CanDecode_42Bit<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : unmanaged, IPixel<TPixel> => TestTiffDecoder(provider);
[Theory]
[WithFile(FlowerRgb161616Contiguous, PixelTypes.Rgba32)]
[WithFile(FlowerRgb161616Planar, PixelTypes.Rgba32)]
public void TiffDecoder_CanDecode_48Bit<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : unmanaged, IPixel<TPixel> => TestTiffDecoder(provider);
[Theory]
[WithFile(GrayscaleDeflateMultistrip, PixelTypes.Rgba32)]
[WithFile(RgbDeflateMultistrip, PixelTypes.Rgba32)]

1
tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs

@ -78,6 +78,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
}
[Theory]
[InlineData(TiffBitsPerPixel.Bit48)]
[InlineData(TiffBitsPerPixel.Bit42)]
[InlineData(TiffBitsPerPixel.Bit36)]
[InlineData(TiffBitsPerPixel.Bit30)]

2
tests/ImageSharp.Tests/TestImages.cs

@ -560,6 +560,8 @@ namespace SixLabors.ImageSharp.Tests
public const string RgbPaletteDeflate = "Tiff/rgb_palette_deflate.tiff";
public const string Flower4BitPalette = "Tiff/flower-palette-04.tiff";
public const string Flower4BitPaletteGray = "Tiff/flower-minisblack-04.tiff";
public const string FlowerRgb161616Contiguous = "Tiff/flower-rgb-contig-16.tiff";
public const string FlowerRgb161616Planar = "Tiff/flower-rgb-planar-16.tiff";
public const string FlowerRgb141414Contiguous = "Tiff/flower-rgb-contig-14.tiff";
public const string FlowerRgb141414Planar = "Tiff/flower-rgb-planar-14.tiff";
public const string FlowerRgb101010Contiguous = "Tiff/flower-rgb-contig-10.tiff";

3
tests/Images/Input/Tiff/flower-rgb-contig-16.tiff

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ab3d6b619a198ff2e5fdd8f9752bf43c5b03a782625b1f0e3f2cfe0f20c4b24a
size 19177

3
tests/Images/Input/Tiff/flower-rgb-planar-16.tiff

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0a143fb6c5792fa7755e06feb757c745ad68944336985dc5be8a0c37247fe36d
size 19177
Loading…
Cancel
Save