diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
index 3aae61448b..9822cf63b4 100644
--- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
+++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
@@ -41,6 +41,11 @@ namespace SixLabors.ImageSharp.Formats.Tiff
///
private ByteOrder byteOrder;
+ ///
+ /// Indicating whether is BigTiff format.
+ ///
+ private bool isBigTiff;
+
///
/// Initializes a new instance of the class.
///
@@ -145,6 +150,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
IEnumerable directories = reader.Read();
this.byteOrder = reader.ByteOrder;
+ this.isBigTiff = reader.IsBigTiff;
var frames = new List>();
foreach (ExifProfile ifd in directories)
@@ -211,16 +217,27 @@ namespace SixLabors.ImageSharp.Formats.Tiff
var frame = new ImageFrame(this.Configuration, width, height, imageFrameMetaData);
int rowsPerStrip = tags.GetValue(ExifTag.RowsPerStrip) != null ? (int)tags.GetValue(ExifTag.RowsPerStrip).Value : TiffConstants.RowsPerStripInfinity;
- ExifLong8Array stripOffsets = tags.GetValueInternal(ExifTag.StripOffsets) as ExifLong8Array;
- ExifLong8Array stripByteCounts = tags.GetValueInternal(ExifTag.StripByteCounts) as ExifLong8Array;
+
+ ulong[] stripOffsets;
+ ulong[] stripByteCounts;
+ if (this.isBigTiff)
+ {
+ stripOffsets = tags.GetValueInternal(ExifTag.StripOffsets)?.GetValue() as ulong[];
+ stripByteCounts = tags.GetValueInternal(ExifTag.StripByteCounts)?.GetValue() as ulong[];
+ }
+ else
+ {
+ stripOffsets = tags.GetValue(ExifTag.StripOffsets)?.Value.Select(s => (ulong)(uint)s).ToArray();
+ stripByteCounts = tags.GetValue(ExifTag.StripByteCounts)?.Value.Select(s => (ulong)(uint)s).ToArray();
+ }
if (this.PlanarConfiguration == TiffPlanarConfiguration.Planar)
{
- this.DecodeStripsPlanar(frame, rowsPerStrip, stripOffsets.Value, stripByteCounts.Value, cancellationToken);
+ this.DecodeStripsPlanar(frame, rowsPerStrip, stripOffsets, stripByteCounts, cancellationToken);
}
else
{
- this.DecodeStripsChunky(frame, rowsPerStrip, stripOffsets.Value, stripByteCounts.Value, cancellationToken);
+ this.DecodeStripsChunky(frame, rowsPerStrip, stripOffsets, stripByteCounts, cancellationToken);
}
return frame;