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