Browse Source

implement adding frames metadata to tiff image metadata

pull/2363/head
Ildar Khayrutdinov 3 years ago
parent
commit
1c23ccb839
  1. 4
      src/ImageSharp/Formats/Tiff/Ifd/DirectoryReader.cs
  2. 9
      src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
  3. 11
      src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs
  4. 8
      src/ImageSharp/Formats/Tiff/TiffMetadata.cs

4
src/ImageSharp/Formats/Tiff/Ifd/DirectoryReader.cs

@ -37,7 +37,7 @@ internal class DirectoryReader
/// Reads image file directories.
/// </summary>
/// <returns>Image file directories.</returns>
public IEnumerable<ExifProfile> Read()
public IList<ExifProfile> 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<ExifProfile> ReadIfds(bool isBigTiff)
private IList<ExifProfile> ReadIfds(bool isBigTiff)
{
var readers = new List<EntryReader>();
while (this.nextIfdOffset != 0 && this.nextIfdOffset < (ulong)this.stream.Length)

9
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<ExifProfile> directories = reader.Read();
IList<ExifProfile> 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<TPixel> 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<ExifProfile> directories = reader.Read();
IList<ExifProfile> 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);

11
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<ExifProfile> 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;

8
src/ImageSharp/Formats/Tiff/TiffMetadata.cs

@ -31,6 +31,14 @@ public class TiffMetadata : IDeepCloneable
/// </summary>
public TiffFormatType FormatType { get; set; }
/// <summary>
/// Gets or sets the frames.
/// </summary>
/// <value>
/// The frames.
/// </value>
public IList<TiffFrameMetadata> Frames { get; set; } = new List<TiffFrameMetadata>();
/// <inheritdoc/>
public IDeepCloneable DeepClone() => new TiffMetadata(this);
}

Loading…
Cancel
Save