Browse Source

Fix build issue, dispose decoded jpeg image

pull/1734/head
Brian Popow 5 years ago
parent
commit
9e6fbdb96b
  1. 16
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs
  2. 6
      src/ImageSharp/Formats/Tiff/Compression/TiffDecoderCompressionType.cs
  3. 2
      tests/ImageSharp.Tests/Formats/Tiff/TiffDecoderTests.cs

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

@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
/// <summary> /// <summary>
/// Class to handle cases where TIFF image data is compressed as a jpeg stream. /// Class to handle cases where TIFF image data is compressed as a jpeg stream.
/// </summary> /// </summary>
internal class JpegTiffCompression : TiffBaseDecompressor internal sealed class JpegTiffCompression : TiffBaseDecompressor
{ {
private readonly Configuration configuration; private readonly Configuration configuration;
@ -49,12 +49,11 @@ 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, int stripHeight, Span<byte> buffer)
{ {
Image<Rgb24> image;
if (this.jpegTables != null) if (this.jpegTables != null)
{ {
var jpegDecoder = new JpegDecoderCore(this.configuration, new JpegDecoder()); using var jpegDecoder = new JpegDecoderCore(this.configuration, new JpegDecoder());
// TODO: Should we pass through the CancellationToken from the tiff decoder? // TODO: Should we pass through the CancellationToken from the tiff decoder?
// If the PhotometricInterpretation is YCbCr we explicitly assume the JPEG data is in RGB color space. // If the PhotometricInterpretation is YCbCr we explicitly assume the JPEG data is in RGB color space.
@ -66,13 +65,18 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
scanDecoder.ResetInterval = 0; scanDecoder.ResetInterval = 0;
jpegDecoder.ParseStream(stream, scanDecoder, CancellationToken.None); jpegDecoder.ParseStream(stream, scanDecoder, CancellationToken.None);
image = new Image<Rgb24>(this.configuration, spectralConverter.PixelBuffer, new ImageMetadata()); using var image = new Image<Rgb24>(this.configuration, spectralConverter.PixelBuffer, new ImageMetadata());
CopyImageBytesToBuffer(buffer, image);
} }
else else
{ {
image = Image.Load<Rgb24>(stream); using var image = Image.Load<Rgb24>(stream);
CopyImageBytesToBuffer(buffer, image);
} }
}
private static void CopyImageBytesToBuffer(Span<byte> buffer, Image<Rgb24> image)
{
int offset = 0; int offset = 0;
for (int y = 0; y < image.Height; y++) for (int y = 0; y < image.Height; y++)
{ {

6
src/ImageSharp/Formats/Tiff/Compression/TiffDecoderCompressionType.cs

@ -36,16 +36,16 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
/// <summary> /// <summary>
/// Image data is compressed using CCITT T.6 fax compression. /// Image data is compressed using CCITT T.6 fax compression.
/// </summary> /// </summary>
T6 = 6, T6 = 5,
/// <summary> /// <summary>
/// Image data is compressed using modified huffman compression. /// Image data is compressed using modified huffman compression.
/// </summary> /// </summary>
HuffmanRle = 5, HuffmanRle = 6,
/// <summary> /// <summary>
/// The image data is compressed as a JPEG stream. /// The image data is compressed as a JPEG stream.
/// </summary> /// </summary>
Jpeg = 6, Jpeg = 7,
} }
} }

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

@ -28,8 +28,6 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
private static MagickReferenceDecoder ReferenceDecoder => new MagickReferenceDecoder(); private static MagickReferenceDecoder ReferenceDecoder => new MagickReferenceDecoder();
[Theory] [Theory]
[WithFile(Calliphora_RgbJpeg, PixelTypes.Rgba32)]
[WithFile(RgbJpeg, PixelTypes.Rgba32)]
[WithFile(RgbUncompressedTiled, PixelTypes.Rgba32)] [WithFile(RgbUncompressedTiled, PixelTypes.Rgba32)]
[WithFile(MultiframeDifferentSize, PixelTypes.Rgba32)] [WithFile(MultiframeDifferentSize, PixelTypes.Rgba32)]
[WithFile(MultiframeDifferentVariants, PixelTypes.Rgba32)] [WithFile(MultiframeDifferentVariants, PixelTypes.Rgba32)]

Loading…
Cancel
Save