diff --git a/src/ImageSharp/Formats/Tiff/Ifd/DirectoryReader.cs b/src/ImageSharp/Formats/Tiff/Ifd/DirectoryReader.cs index 54d5c4ce86..755e79e42e 100644 --- a/src/ImageSharp/Formats/Tiff/Ifd/DirectoryReader.cs +++ b/src/ImageSharp/Formats/Tiff/Ifd/DirectoryReader.cs @@ -37,7 +37,7 @@ internal class DirectoryReader /// Reads image file directories. /// /// Image file directories. - public IEnumerable Read() + public IList Read() { this.ByteOrder = ReadByteOrder(this.stream); var headerReader = new HeaderReader(this.stream, this.ByteOrder); @@ -66,7 +66,7 @@ internal class DirectoryReader throw TiffThrowHelper.ThrowInvalidHeader(); } - private IEnumerable ReadIfds(bool isBigTiff) + private IList ReadIfds(bool isBigTiff) { var readers = new List(); while (this.nextIfdOffset != 0 && this.nextIfdOffset < (ulong)this.stream.Length) diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs index 8333dbf31c..0579a5dd10 100644 --- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs +++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs @@ -169,7 +169,7 @@ internal class TiffDecoderCore : IImageDecoderInternals this.inputStream = stream; var reader = new DirectoryReader(stream, this.configuration.MemoryAllocator); - IEnumerable directories = reader.Read(); + IList directories = reader.Read(); this.byteOrder = reader.ByteOrder; this.isBigTiff = reader.IsBigTiff; @@ -188,6 +188,8 @@ internal class TiffDecoderCore : IImageDecoderInternals ImageMetadata metadata = TiffDecoderMetadataCreator.Create(frames, this.skipMetadata, reader.ByteOrder, reader.IsBigTiff); + TiffDecoderMetadataCreator.FillFrames(metadata.GetTiffMetadata(), directories); + // TODO: Tiff frames can have different sizes. ImageFrame root = frames[0]; this.Dimensions = root.Size(); @@ -217,12 +219,15 @@ internal class TiffDecoderCore : IImageDecoderInternals { this.inputStream = stream; DirectoryReader reader = new(stream, this.configuration.MemoryAllocator); - IEnumerable directories = reader.Read(); + IList directories = reader.Read(); ExifProfile rootFrameExifProfile = directories.First(); TiffFrameMetadata rootMetadata = TiffFrameMetadata.Parse(rootFrameExifProfile); ImageMetadata metadata = TiffDecoderMetadataCreator.Create(reader.ByteOrder, reader.IsBigTiff, rootFrameExifProfile); + + TiffDecoderMetadataCreator.FillFrames(metadata.GetTiffMetadata(), directories); + int width = GetImageWidth(rootFrameExifProfile); int height = GetImageHeight(rootFrameExifProfile); diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs index 1a6c9dd7de..c2a12c93cf 100644 --- a/src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs +++ b/src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs @@ -61,10 +61,19 @@ internal static class TiffDecoderMetadataCreator TiffMetadata tiffMetadata = imageMetaData.GetTiffMetadata(); tiffMetadata.ByteOrder = byteOrder; tiffMetadata.FormatType = isBigTiff ? TiffFormatType.BigTIFF : TiffFormatType.Default; - return imageMetaData; } + public static void FillFrames(TiffMetadata tiffMetadata, IList directories) + { + foreach (ExifProfile dir in directories) + { + TiffFrameMetadata meta = TiffFormat.Instance.CreateDefaultFormatFrameMetadata(); + TiffFrameMetadata.Parse(meta, dir); + tiffMetadata.Frames.Add(meta); + } + } + private static void SetResolution(ImageMetadata imageMetaData, ExifProfile exifProfile) { imageMetaData.ResolutionUnits = exifProfile != null ? UnitConverter.ExifProfileToResolutionUnit(exifProfile) : PixelResolutionUnit.PixelsPerInch; diff --git a/src/ImageSharp/Formats/Tiff/TiffMetadata.cs b/src/ImageSharp/Formats/Tiff/TiffMetadata.cs index 29ffc82ce0..6f9af6c07b 100644 --- a/src/ImageSharp/Formats/Tiff/TiffMetadata.cs +++ b/src/ImageSharp/Formats/Tiff/TiffMetadata.cs @@ -31,6 +31,14 @@ public class TiffMetadata : IDeepCloneable /// public TiffFormatType FormatType { get; set; } + /// + /// Gets or sets the frames. + /// + /// + /// The frames. + /// + public IList Frames { get; set; } = new List(); + /// public IDeepCloneable DeepClone() => new TiffMetadata(this); }