Browse Source

Read complete jpeg stream, if JPEGTables is not present

pull/1734/head
Brian Popow 5 years ago
parent
commit
48374293f9
  1. 25
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs
  2. 1
      tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs
  3. 1
      tests/ImageSharp.Tests/TestImages.cs
  4. 3
      tests/Images/Input/Tiff/rgb_jpegcompressed_nojpegtable.tiff

25
src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs

@ -42,16 +42,25 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
/// <inheritdoc/> /// <inheritdoc/>
protected override void Decompress(BufferedReadStream stream, int byteCount, Span<byte> buffer) protected override void Decompress(BufferedReadStream stream, int byteCount, Span<byte> buffer)
{ {
var jpegDecoder = new JpegDecoderCore(this.configuration, new JpegDecoder()); Image<Rgb24> 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<Rgb24>(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? image = new Image<Rgb24>(this.configuration, spectralConverter.PixelBuffer, new ImageMetadata());
using var spectralConverter = new SpectralConverter<Rgb24>(this.configuration, CancellationToken.None); }
var scanDecoder = new HuffmanScanDecoder(stream, spectralConverter, CancellationToken.None); else
jpegDecoder.LoadTables(this.jpegTables, scanDecoder); {
scanDecoder.ResetInterval = 0; image = Image.Load<Rgb24>(stream);
jpegDecoder.ParseStream(stream, scanDecoder, CancellationToken.None); }
var image = new Image<Rgb24>(this.configuration, spectralConverter.PixelBuffer, new ImageMetadata());
int offset = 0; int offset = 0;
for (int y = 0; y < image.Height; y++) for (int y = 0; y < image.Height; y++)
{ {

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

@ -372,6 +372,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
[WithFile(RgbJpegCompressed, PixelTypes.Rgba32)] [WithFile(RgbJpegCompressed, PixelTypes.Rgba32)]
[WithFile(RgbWithStripsJpegCompressed, PixelTypes.Rgba32)] [WithFile(RgbWithStripsJpegCompressed, PixelTypes.Rgba32)]
[WithFile(YCbCrJpegCompressed, PixelTypes.Rgba32)] [WithFile(YCbCrJpegCompressed, PixelTypes.Rgba32)]
[WithFile(RgbJpegCompressedNoJpegTable, PixelTypes.Rgba32)]
public void TiffDecoder_CanDecode_JpegCompressed<TPixel>(TestImageProvider<TPixel> provider) public void TiffDecoder_CanDecode_JpegCompressed<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : unmanaged, IPixel<TPixel> => TestTiffDecoder(provider); where TPixel : unmanaged, IPixel<TPixel> => TestTiffDecoder(provider);

1
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 RgbDeflateMultistrip = "Tiff/rgb_deflate_multistrip.tiff";
public const string RgbJpegCompressed = "Tiff/rgb_jpegcompression.tiff"; public const string RgbJpegCompressed = "Tiff/rgb_jpegcompression.tiff";
public const string RgbWithStripsJpegCompressed = "Tiff/rgb_jpegcompressed_stripped.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 RgbLzwPredictor = "Tiff/rgb_lzw_predictor.tiff";
public const string RgbLzwNoPredictor = "Tiff/rgb_lzw_no_predictor.tiff"; public const string RgbLzwNoPredictor = "Tiff/rgb_lzw_no_predictor.tiff";
public const string RgbLzwNoPredictorMultistrip = "Tiff/rgb_lzw_noPredictor_multistrip.tiff"; public const string RgbLzwNoPredictorMultistrip = "Tiff/rgb_lzw_noPredictor_multistrip.tiff";

3
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
Loading…
Cancel
Save