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);
}