|
|
|
@ -149,7 +149,8 @@ namespace SixLabors.ImageSharp.Formats.Tiff |
|
|
|
var frames = new List<ImageFrame<TPixel>>(); |
|
|
|
foreach (ExifProfile ifd in directories) |
|
|
|
{ |
|
|
|
ImageFrame<TPixel> frame = this.DecodeFrame<TPixel>(ifd); |
|
|
|
cancellationToken.ThrowIfCancellationRequested(); |
|
|
|
ImageFrame<TPixel> frame = this.DecodeFrame<TPixel>(ifd, cancellationToken); |
|
|
|
frames.Add(frame); |
|
|
|
} |
|
|
|
|
|
|
|
@ -191,10 +192,9 @@ namespace SixLabors.ImageSharp.Formats.Tiff |
|
|
|
/// </summary>
|
|
|
|
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|
|
|
/// <param name="tags">The IFD tags.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// The tiff frame.
|
|
|
|
/// </returns>
|
|
|
|
private ImageFrame<TPixel> DecodeFrame<TPixel>(ExifProfile tags) |
|
|
|
/// <param name="cancellationToken">The token to monitor cancellation.</param>
|
|
|
|
/// <returns> The tiff frame. </returns>
|
|
|
|
private ImageFrame<TPixel> DecodeFrame<TPixel>(ExifProfile tags, CancellationToken cancellationToken) |
|
|
|
where TPixel : unmanaged, IPixel<TPixel> |
|
|
|
{ |
|
|
|
ImageFrameMetadata imageFrameMetaData = this.ignoreMetadata ? |
|
|
|
@ -216,11 +216,11 @@ namespace SixLabors.ImageSharp.Formats.Tiff |
|
|
|
|
|
|
|
if (this.PlanarConfiguration == TiffPlanarConfiguration.Planar) |
|
|
|
{ |
|
|
|
this.DecodeStripsPlanar(frame, rowsPerStrip, stripOffsets, stripByteCounts); |
|
|
|
this.DecodeStripsPlanar(frame, rowsPerStrip, stripOffsets, stripByteCounts, cancellationToken); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
this.DecodeStripsChunky(frame, rowsPerStrip, stripOffsets, stripByteCounts); |
|
|
|
this.DecodeStripsChunky(frame, rowsPerStrip, stripOffsets, stripByteCounts, cancellationToken); |
|
|
|
} |
|
|
|
|
|
|
|
return frame; |
|
|
|
@ -268,14 +268,15 @@ namespace SixLabors.ImageSharp.Formats.Tiff |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Decodes the image data for strip encoded data.
|
|
|
|
/// Decodes the image data for planar encoded pixel data.
|
|
|
|
/// </summary>
|
|
|
|
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|
|
|
/// <param name="frame">The image frame to decode data into.</param>
|
|
|
|
/// <param name="rowsPerStrip">The number of rows per strip of data.</param>
|
|
|
|
/// <param name="stripOffsets">An array of byte offsets to each strip in the image.</param>
|
|
|
|
/// <param name="stripByteCounts">An array of the size of each strip (in bytes).</param>
|
|
|
|
private void DecodeStripsPlanar<TPixel>(ImageFrame<TPixel> frame, int rowsPerStrip, Number[] stripOffsets, Number[] stripByteCounts) |
|
|
|
/// <param name="cancellationToken">The token to monitor cancellation.</param>
|
|
|
|
private void DecodeStripsPlanar<TPixel>(ImageFrame<TPixel> frame, int rowsPerStrip, Number[] stripOffsets, Number[] stripByteCounts, CancellationToken cancellationToken) |
|
|
|
where TPixel : unmanaged, IPixel<TPixel> |
|
|
|
{ |
|
|
|
int stripsPerPixel = this.BitsPerSample.Channels; |
|
|
|
@ -319,6 +320,8 @@ namespace SixLabors.ImageSharp.Formats.Tiff |
|
|
|
|
|
|
|
for (int i = 0; i < stripsPerPlane; i++) |
|
|
|
{ |
|
|
|
cancellationToken.ThrowIfCancellationRequested(); |
|
|
|
|
|
|
|
int stripHeight = i < stripsPerPlane - 1 || frame.Height % rowsPerStrip == 0 ? rowsPerStrip : frame.Height % rowsPerStrip; |
|
|
|
|
|
|
|
int stripIndex = i; |
|
|
|
@ -340,7 +343,16 @@ namespace SixLabors.ImageSharp.Formats.Tiff |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void DecodeStripsChunky<TPixel>(ImageFrame<TPixel> frame, int rowsPerStrip, Number[] stripOffsets, Number[] stripByteCounts) |
|
|
|
/// <summary>
|
|
|
|
/// Decodes the image data for chunky encoded pixel data.
|
|
|
|
/// </summary>
|
|
|
|
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|
|
|
/// <param name="frame">The image frame to decode data into.</param>
|
|
|
|
/// <param name="rowsPerStrip">The rows per strip.</param>
|
|
|
|
/// <param name="stripOffsets">The strip offsets.</param>
|
|
|
|
/// <param name="stripByteCounts">The strip byte counts.</param>
|
|
|
|
/// <param name="cancellationToken">The token to monitor cancellation.</param>
|
|
|
|
private void DecodeStripsChunky<TPixel>(ImageFrame<TPixel> frame, int rowsPerStrip, Number[] stripOffsets, Number[] stripByteCounts, CancellationToken cancellationToken) |
|
|
|
where TPixel : unmanaged, IPixel<TPixel> |
|
|
|
{ |
|
|
|
// If the rowsPerStrip has the default value, which is effectively infinity. That is, the entire image is one strip.
|
|
|
|
@ -383,6 +395,8 @@ namespace SixLabors.ImageSharp.Formats.Tiff |
|
|
|
|
|
|
|
for (int stripIndex = 0; stripIndex < stripOffsets.Length; stripIndex++) |
|
|
|
{ |
|
|
|
cancellationToken.ThrowIfCancellationRequested(); |
|
|
|
|
|
|
|
int stripHeight = stripIndex < stripOffsets.Length - 1 || frame.Height % rowsPerStrip == 0 |
|
|
|
? rowsPerStrip |
|
|
|
: frame.Height % rowsPerStrip; |
|
|
|
|