From 48374293f9347b276354ca2c6e1eae16eddc23b1 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Wed, 11 Aug 2021 15:34:46 +0200 Subject: [PATCH] Read complete jpeg stream, if JPEGTables is not present --- .../Decompressors/JpegTiffCompression.cs | 25 +++++++++++++------ .../Formats/Tiff/TiffDecoderTests.cs | 1 + tests/ImageSharp.Tests/TestImages.cs | 1 + .../Tiff/rgb_jpegcompressed_nojpegtable.tiff | 3 +++ 4 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 tests/Images/Input/Tiff/rgb_jpegcompressed_nojpegtable.tiff diff --git a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs index 5a26df95ac..2722c7db48 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs @@ -42,16 +42,25 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors /// protected override void Decompress(BufferedReadStream stream, int byteCount, Span buffer) { - var jpegDecoder = new JpegDecoderCore(this.configuration, new JpegDecoder()); + Image image; + if (this.jpegTables != null) + { + var jpegDecoder = new JpegDecoderCore(this.configuration, new JpegDecoder()); + + // Should we pass through the CancellationToken from the tiff decoder? + using var spectralConverter = new SpectralConverter(this.configuration, CancellationToken.None); + var scanDecoder = new HuffmanScanDecoder(stream, spectralConverter, CancellationToken.None); + jpegDecoder.LoadTables(this.jpegTables, scanDecoder); + scanDecoder.ResetInterval = 0; + jpegDecoder.ParseStream(stream, scanDecoder, CancellationToken.None); - // Should we pass through the CancellationToken from the tiff decoder? - using var spectralConverter = new SpectralConverter(this.configuration, CancellationToken.None); - var scanDecoder = new HuffmanScanDecoder(stream, spectralConverter, CancellationToken.None); - jpegDecoder.LoadTables(this.jpegTables, scanDecoder); - scanDecoder.ResetInterval = 0; - jpegDecoder.ParseStream(stream, scanDecoder, CancellationToken.None); + image = new Image(this.configuration, spectralConverter.PixelBuffer, new ImageMetadata()); + } + else + { + image = Image.Load(stream); + } - var image = new Image(this.configuration, spectralConverter.PixelBuffer, new ImageMetadata()); int offset = 0; for (int y = 0; y < image.Height; y++) { diff --git a/tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs index 157a48d6d8..a1d3865a29 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs @@ -372,6 +372,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff [WithFile(RgbJpegCompressed, PixelTypes.Rgba32)] [WithFile(RgbWithStripsJpegCompressed, PixelTypes.Rgba32)] [WithFile(YCbCrJpegCompressed, PixelTypes.Rgba32)] + [WithFile(RgbJpegCompressedNoJpegTable, PixelTypes.Rgba32)] public void TiffDecoder_CanDecode_JpegCompressed(TestImageProvider provider) where TPixel : unmanaged, IPixel => TestTiffDecoder(provider); diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 6cdf498949..b0b962624b 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -554,6 +554,7 @@ namespace SixLabors.ImageSharp.Tests public const string RgbDeflateMultistrip = "Tiff/rgb_deflate_multistrip.tiff"; public const string RgbJpegCompressed = "Tiff/rgb_jpegcompression.tiff"; public const string RgbWithStripsJpegCompressed = "Tiff/rgb_jpegcompressed_stripped.tiff"; + public const string RgbJpegCompressedNoJpegTable = "Tiff/rgb_jpegcompressed_nojpegtable.tiff"; public const string RgbLzwPredictor = "Tiff/rgb_lzw_predictor.tiff"; public const string RgbLzwNoPredictor = "Tiff/rgb_lzw_no_predictor.tiff"; public const string RgbLzwNoPredictorMultistrip = "Tiff/rgb_lzw_noPredictor_multistrip.tiff"; diff --git a/tests/Images/Input/Tiff/rgb_jpegcompressed_nojpegtable.tiff b/tests/Images/Input/Tiff/rgb_jpegcompressed_nojpegtable.tiff new file mode 100644 index 0000000000..b97ab8830d --- /dev/null +++ b/tests/Images/Input/Tiff/rgb_jpegcompressed_nojpegtable.tiff @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b81013d7b0a29ed1ac9c33e175e0c0e69494b93b2b65b692f16d9ea042b9d5d +size 7759