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.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<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();
Span<byte> 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<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();

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)
{
// 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<byte> rows = this.bitStrip.GetSpan();
Span<byte> rows = this.bitStrip.Slice(0, bytesPerStrip);
rows.Clear();
int xx = 0;
for (int s = 0; s < height; s++)

Loading…
Cancel
Save