From 677800f3267ed7b41a99a9723f492b62b4e96518 Mon Sep 17 00:00:00 2001 From: Ildar Khayrutdinov Date: Sun, 14 Feb 2021 20:44:17 +0300 Subject: [PATCH] PackBits bug fix --- .../Compressors/PackBitsCompressor.cs | 17 +++++++++++------ .../Formats/Tiff/Writers/TiffBiColorWriter.cs | 9 +++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/ImageSharp/Formats/Tiff/Compression/Compressors/PackBitsCompressor.cs b/src/ImageSharp/Formats/Tiff/Compression/Compressors/PackBitsCompressor.cs index 627ca6cbb2..ce5d8a7695 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/Compressors/PackBitsCompressor.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/Compressors/PackBitsCompressor.cs @@ -3,8 +3,6 @@ using System; using System.IO; -using SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression.Compressors; -using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression.Compressors @@ -22,16 +20,23 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression.Compressors public override void Initialize(int rowsPerStrip) { - int additionalBytes = (this.BytesPerRow / 127) + 1; - this.pixelData = this.Allocator.AllocateManagedByteBuffer((this.BytesPerRow + additionalBytes) * rowsPerStrip); + int additionalBytes = ((this.BytesPerRow + 126) / 127) + 1; + this.pixelData = this.Allocator.AllocateManagedByteBuffer(this.BytesPerRow + additionalBytes); } public override void CompressStrip(Span rows, int height) { + DebugGuard.IsTrue(rows.Length % height == 0, "Invalid height"); + DebugGuard.IsTrue(this.BytesPerRow == rows.Length / height, "The widths must match"); + this.pixelData.Clear(); Span span = this.pixelData.GetSpan(); - int size = PackBitsWriter.PackBits(rows, span); - this.Output.Write(span.Slice(0, size)); + for (int i = 0; i < height; i++) + { + Span row = rows.Slice(i * this.BytesPerRow, this.BytesPerRow); + int size = PackBitsWriter.PackBits(row, span); + this.Output.Write(span.Slice(0, size)); + } } protected override void Dispose(bool disposing) => this.pixelData?.Dispose(); diff --git a/src/ImageSharp/Formats/Tiff/Writers/TiffBiColorWriter.cs b/src/ImageSharp/Formats/Tiff/Writers/TiffBiColorWriter.cs index 5db0eff733..cd17f1665b 100644 --- a/src/ImageSharp/Formats/Tiff/Writers/TiffBiColorWriter.cs +++ b/src/ImageSharp/Formats/Tiff/Writers/TiffBiColorWriter.cs @@ -51,18 +51,19 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Writers if (compressor.Method == TiffEncoderCompression.CcittGroup3Fax || compressor.Method == TiffEncoderCompression.ModifiedHuffman) { + // special case for T4BitCompressor compressor.CompressStrip(pixelAsGraySpan, height); } else { + int bytesPerStrip = this.BytesPerRow * height; if (this.bitStrip == null) { - int bytesPerRow = this.BytesPerRow * height; - this.bitStrip = this.MemoryAllocator.AllocateManagedByteBuffer(bytesPerRow); + this.bitStrip = this.MemoryAllocator.AllocateManagedByteBuffer(bytesPerStrip); } - this.bitStrip.Clear(); - Span rows = this.bitStrip.GetSpan(); + Span rows = this.bitStrip.Slice(0, bytesPerStrip); + rows.Clear(); int xx = 0; for (int s = 0; s < height; s++)