Browse Source

Always set YcbcrSubSampling to 1:1 for TiffCompression.Jpeg, fixes issue #2679

pull/2789/head
Brian Popow 2 years ago
parent
commit
e8bbdf703a
  1. 40
      src/ImageSharp/Formats/Tiff/TiffDecoderOptionsParser.cs

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

@ -620,7 +620,12 @@ internal static class TiffDecoderOptionsParser
}
options.CompressionType = TiffDecoderCompressionType.OldJpeg;
AdjustOptionsYCbCrJpegCompression(options);
if (options.PhotometricInterpretation is TiffPhotometricInterpretation.YCbCr)
{
// Note: Setting PhotometricInterpretation and color type to RGB here, since the jpeg decoder will handle the conversion of the pixel data.
options.PhotometricInterpretation = TiffPhotometricInterpretation.Rgb;
options.ColorType = TiffColorType.Rgb;
}
break;
}
@ -628,7 +633,20 @@ internal static class TiffDecoderOptionsParser
case TiffCompression.Jpeg:
{
options.CompressionType = TiffDecoderCompressionType.Jpeg;
AdjustOptionsYCbCrJpegCompression(options);
if (options.PhotometricInterpretation is TiffPhotometricInterpretation.YCbCr && options.JpegTables is null)
{
// Note: Setting PhotometricInterpretation and color type to RGB here, since the jpeg decoder will handle the conversion of the pixel data.
options.PhotometricInterpretation = TiffPhotometricInterpretation.Rgb;
options.ColorType = TiffColorType.Rgb;
}
// Some tiff encoder set this to values different from [1, 1]. The jpeg decoder already handles this,
// so we set this always to [1, 1], see: https://github.com/SixLabors/ImageSharp/issues/2679
if (options.PhotometricInterpretation is TiffPhotometricInterpretation.YCbCr)
{
options.YcbcrSubSampling[0] = 1;
options.YcbcrSubSampling[1] = 1;
}
break;
}
@ -647,24 +665,6 @@ internal static class TiffDecoderOptionsParser
}
}
private static void AdjustOptionsYCbCrJpegCompression(TiffDecoderCore options)
{
if (options.PhotometricInterpretation is TiffPhotometricInterpretation.YCbCr)
{
// Note: Setting PhotometricInterpretation and color type to RGB here, since the jpeg decoder will handle the conversion of the pixel data.
options.PhotometricInterpretation = TiffPhotometricInterpretation.Rgb;
options.ColorType = TiffColorType.Rgb;
}
if (options.PhotometricInterpretation is TiffPhotometricInterpretation.YCbCr)
{
// Some tiff encoder set this to values different from [1, 1]. The jpeg decoder already handles this,
// so we set this always to [1, 1], see: https://github.com/SixLabors/ImageSharp/issues/2679
options.YcbcrSubSampling[0] = 1;
options.YcbcrSubSampling[1] = 1;
}
}
private static bool IsBiColorCompression(TiffCompression? compression)
{
if (compression is TiffCompression.Ccitt1D or TiffCompression.CcittGroup3Fax or

Loading…
Cancel
Save