From 0b55bed262d75aac144e295bf83b98d1cb3ae142 Mon Sep 17 00:00:00 2001 From: Dmitry Pentin Date: Tue, 7 Sep 2021 04:12:56 +0300 Subject: [PATCH] Slightly improved tiff decoding with jpeg data, removed unnecessary GC pressure --- .../Jpeg/Components/Decoder/SpectralConverter.cs | 2 +- .../Compression/Decompressors/JpegTiffCompression.cs | 11 +++++------ .../Decompressors/RgbJpegSpectralConverter.cs | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter.cs index 23bb01409c..e975b11fbb 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter.cs @@ -39,6 +39,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder /// The jpeg frame with the color space to convert to. /// The raw JPEG data. /// The color converter. - public virtual JpegColorConverter GetColorConverter(JpegFrame frame, IRawJpegData jpegData) => JpegColorConverter.GetConverter(jpegData.ColorSpace, frame.Precision); + protected virtual JpegColorConverter GetColorConverter(JpegFrame frame, IRawJpegData jpegData) => JpegColorConverter.GetConverter(jpegData.ColorSpace, frame.Precision); } } diff --git a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs index bd1c496b49..e764c014d3 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/JpegTiffCompression.cs @@ -65,22 +65,21 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors scanDecoder.ResetInterval = 0; jpegDecoder.ParseStream(stream, scanDecoder, CancellationToken.None); - using var image = new Image(this.configuration, spectralConverter.PixelBuffer, new ImageMetadata()); - CopyImageBytesToBuffer(buffer, image); + CopyImageBytesToBuffer(buffer, spectralConverter.PixelBuffer); } else { using var image = Image.Load(stream); - CopyImageBytesToBuffer(buffer, image); + CopyImageBytesToBuffer(buffer, image.Frames.RootFrame.PixelBuffer); } } - private static void CopyImageBytesToBuffer(Span buffer, Image image) + private static void CopyImageBytesToBuffer(Span buffer, Buffer2D pixelBuffer) { int offset = 0; - for (int y = 0; y < image.Height; y++) + for (int y = 0; y < pixelBuffer.Height; y++) { - Span pixelRowSpan = image.GetPixelRowSpan(y); + Span pixelRowSpan = pixelBuffer.GetRowSpan(y); Span rgbBytes = MemoryMarshal.AsBytes(pixelRowSpan); rgbBytes.CopyTo(buffer.Slice(offset)); offset += rgbBytes.Length; diff --git a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/RgbJpegSpectralConverter.cs b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/RgbJpegSpectralConverter.cs index 45be3dd038..aefec7fa34 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/RgbJpegSpectralConverter.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/RgbJpegSpectralConverter.cs @@ -28,6 +28,6 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors } /// - public override JpegColorConverter GetColorConverter(JpegFrame frame, IRawJpegData jpegData) => JpegColorConverter.GetConverter(JpegColorSpace.RGB, frame.Precision); + protected override JpegColorConverter GetColorConverter(JpegFrame frame, IRawJpegData jpegData) => JpegColorConverter.GetConverter(JpegColorSpace.RGB, frame.Precision); } }