Browse Source

Move IPTC and ICC Profile to image frame metadata

pull/1553/head
Brian Popow 5 years ago
parent
commit
e2bd192c79
  1. 13
      src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs
  2. 14
      src/ImageSharp/Metadata/ImageFrameMetadata.cs
  3. 5
      tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs
  4. 20
      tests/ImageSharp.Tests/Metadata/ImageFrameMetadataTests.cs

13
src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs

@ -40,18 +40,15 @@ namespace SixLabors.ImageSharp.Formats.Tiff
{
ImageFrame<TPixel> frame = frames[i];
ImageFrameMetadata frameMetaData = frame.Metadata;
if (imageMetaData.IptcProfile == null && TryGetIptc(frameMetaData.ExifProfile.Values, out byte[] iptcBytes))
if (TryGetIptc(frameMetaData.ExifProfile.Values, out byte[] iptcBytes))
{
imageMetaData.IptcProfile = new IptcProfile(iptcBytes);
frameMetaData.IptcProfile = new IptcProfile(iptcBytes);
}
if (imageMetaData.IccProfile == null)
IExifValue<byte[]> iccProfileBytes = frameMetaData.ExifProfile.GetValue(ExifTag.IccProfile);
if (iccProfileBytes != null)
{
IExifValue<byte[]> val = frameMetaData.ExifProfile.GetValue(ExifTag.IccProfile);
if (val != null)
{
imageMetaData.IccProfile = new IccProfile(val.Value);
}
frameMetaData.IccProfile = new IccProfile(iccProfileBytes.Value);
}
}
}

14
src/ImageSharp/Metadata/ImageFrameMetadata.cs

@ -5,6 +5,8 @@ using System;
using System.Collections.Generic;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Metadata.Profiles.Exif;
using SixLabors.ImageSharp.Metadata.Profiles.Icc;
using SixLabors.ImageSharp.Metadata.Profiles.Iptc;
namespace SixLabors.ImageSharp.Metadata
{
@ -39,6 +41,8 @@ namespace SixLabors.ImageSharp.Metadata
}
this.ExifProfile = other.ExifProfile?.DeepClone();
this.IccProfile = other.IccProfile?.DeepClone();
this.IptcProfile = other.IptcProfile?.DeepClone();
this.XmpProfile = other.XmpProfile != null ? new byte[other.XmpProfile.Length] : null;
other.XmpProfile?.AsSpan().CopyTo(this.XmpProfile.AsSpan());
}
@ -53,6 +57,16 @@ namespace SixLabors.ImageSharp.Metadata
/// </summary>
internal byte[] XmpProfile { get; set; }
/// <summary>
/// Gets or sets the list of ICC profiles.
/// </summary>
public IccProfile IccProfile { get; set; }
/// <summary>
/// Gets or sets the iptc profile.
/// </summary>
public IptcProfile IptcProfile { get; set; }
/// <inheritdoc/>
public ImageFrameMetadata DeepClone() => new ImageFrameMetadata(this);

5
tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs

@ -133,8 +133,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
{
using Image<TPixel> image = provider.GetImage(TiffDecoder);
Assert.NotNull(image.Metadata.IptcProfile);
IptcValue byline = image.Metadata.IptcProfile.Values.FirstOrDefault(data => data.Tag == IptcTag.Byline);
IptcProfile iptcProfile = image.Frames.RootFrame.Metadata.IptcProfile;
Assert.NotNull(iptcProfile);
IptcValue byline = iptcProfile.Values.FirstOrDefault(data => data.Tag == IptcTag.Byline);
Assert.NotNull(byline);
Assert.Equal("Studio Mantyniemi", byline.Value);
}

20
tests/ImageSharp.Tests/Metadata/ImageFrameMetadataTests.cs

@ -4,8 +4,10 @@
using System.Linq;
using SixLabors.ImageSharp.Formats.Gif;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.Metadata.Profiles.Exif;
using SixLabors.ImageSharp.Metadata.Profiles.Icc;
using Xunit;
using ExifProfile = SixLabors.ImageSharp.Metadata.Profiles.Exif.ExifProfile;
using ExifTag = SixLabors.ImageSharp.Metadata.Profiles.Exif.ExifTag;
namespace SixLabors.ImageSharp.Tests.Metadata
{
@ -43,10 +45,20 @@ namespace SixLabors.ImageSharp.Tests.Metadata
var exifProfile = new ExifProfile();
exifProfile.SetValue(ExifTag.Software, "UnitTest");
exifProfile.SetValue(ExifTag.Artist, "UnitTest");
var iccProfile = new IccProfile()
{
Header = new IccProfileHeader()
{
CmmType = "Unittest"
}
};
var iptcProfile = new ImageSharp.Metadata.Profiles.Iptc.IptcProfile();
var metaData = new ImageFrameMetadata()
{
XmpProfile = xmpProfile,
ExifProfile = exifProfile
ExifProfile = exifProfile,
IccProfile = iccProfile,
IptcProfile = iptcProfile
};
// act
@ -56,11 +68,15 @@ namespace SixLabors.ImageSharp.Tests.Metadata
Assert.NotNull(clone);
Assert.NotNull(clone.ExifProfile);
Assert.NotNull(clone.XmpProfile);
Assert.NotNull(clone.IccProfile);
Assert.NotNull(clone.IptcProfile);
Assert.False(metaData.ExifProfile.Equals(clone.ExifProfile));
Assert.True(metaData.ExifProfile.Values.Count == clone.ExifProfile.Values.Count);
Assert.False(metaData.XmpProfile.Equals(clone.XmpProfile));
Assert.True(metaData.XmpProfile.SequenceEqual(clone.XmpProfile));
Assert.False(metaData.GetGifMetadata().Equals(clone.GetGifMetadata()));
Assert.False(metaData.IccProfile.Equals(clone.IccProfile));
Assert.False(metaData.IptcProfile.Equals(clone.IptcProfile));
}
}
}

Loading…
Cancel
Save