Browse Source

PackBits bug fix

pull/1570/head
Ildar Khayrutdinov 5 years ago
parent
commit
677800f326
  1. 17
      src/ImageSharp/Formats/Tiff/Compression/Compressors/PackBitsCompressor.cs
  2. 9
      src/ImageSharp/Formats/Tiff/Writers/TiffBiColorWriter.cs

17
src/ImageSharp/Formats/Tiff/Compression/Compressors/PackBitsCompressor.cs

@ -3,8 +3,6 @@
using System; using System;
using System.IO; using System.IO;
using SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression.Compressors;
using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants;
using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Memory;
namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression.Compressors 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) public override void Initialize(int rowsPerStrip)
{ {
int additionalBytes = (this.BytesPerRow / 127) + 1; int additionalBytes = ((this.BytesPerRow + 126) / 127) + 1;
this.pixelData = this.Allocator.AllocateManagedByteBuffer((this.BytesPerRow + additionalBytes) * rowsPerStrip); this.pixelData = this.Allocator.AllocateManagedByteBuffer(this.BytesPerRow + additionalBytes);
} }
public override void CompressStrip(Span<byte> rows, int height) public override void CompressStrip(Span<byte> 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(); this.pixelData.Clear();
Span<byte> span = this.pixelData.GetSpan(); Span<byte> span = this.pixelData.GetSpan();
int size = PackBitsWriter.PackBits(rows, span); for (int i = 0; i < height; i++)
this.Output.Write(span.Slice(0, size)); {
Span<byte> 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(); protected override void Dispose(bool disposing) => this.pixelData?.Dispose();

9
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) if (compressor.Method == TiffEncoderCompression.CcittGroup3Fax || compressor.Method == TiffEncoderCompression.ModifiedHuffman)
{ {
// special case for T4BitCompressor
compressor.CompressStrip(pixelAsGraySpan, height); compressor.CompressStrip(pixelAsGraySpan, height);
} }
else else
{ {
int bytesPerStrip = this.BytesPerRow * height;
if (this.bitStrip == null) if (this.bitStrip == null)
{ {
int bytesPerRow = this.BytesPerRow * height; this.bitStrip = this.MemoryAllocator.AllocateManagedByteBuffer(bytesPerStrip);
this.bitStrip = this.MemoryAllocator.AllocateManagedByteBuffer(bytesPerRow);
} }
this.bitStrip.Clear(); Span<byte> rows = this.bitStrip.Slice(0, bytesPerStrip);
Span<byte> rows = this.bitStrip.GetSpan(); rows.Clear();
int xx = 0; int xx = 0;
for (int s = 0; s < height; s++) for (int s = 0; s < height; s++)

Loading…
Cancel
Save