diff --git a/src/ImageSharp/Formats/Tiff/MetadataExtensions.cs b/src/ImageSharp/Formats/Tiff/MetadataExtensions.cs
index b9da86fc4..c1cd3b153 100644
--- a/src/ImageSharp/Formats/Tiff/MetadataExtensions.cs
+++ b/src/ImageSharp/Formats/Tiff/MetadataExtensions.cs
@@ -17,12 +17,5 @@ namespace SixLabors.ImageSharp
/// The metadata this method extends.
/// The .
public static TiffMetadata GetTiffMetadata(this ImageMetadata metadata) => metadata.GetFormatMetadata(TiffFormat.Instance);
-
- ///
- /// Gets the tiff format specific metadata for the image frame.
- ///
- /// The metadata this method extends.
- /// The .
- public static TiffFrameMetadata GetTiffMetadata(this ImageFrameMetadata metadata) => metadata.GetFormatMetadata(TiffFormat.Instance);
}
}
diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
index da0d73832..31c91c590 100644
--- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
+++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
@@ -179,8 +179,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
ImageFrameMetadata imageFrameMetaData = this.ignoreMetadata ?
new ImageFrameMetadata() :
new ImageFrameMetadata { ExifProfile = tags, XmpProfile = tags.GetValue(ExifTag.XMP)?.Value };
- tiffFrameMetaData = imageFrameMetaData.GetTiffMetadata();
- tiffFrameMetaData.Initialize(tags);
+ tiffFrameMetaData = new TiffFrameMetadata(tags);
this.VerifyAndParse(tiffFrameMetaData);
diff --git a/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs
index 24fd46526..6faab8383 100644
--- a/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs
+++ b/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs
@@ -112,9 +112,9 @@ namespace SixLabors.ImageSharp.Formats.Tiff
this.configuration = image.GetConfiguration();
ImageMetadata metadata = image.Metadata;
TiffMetadata tiffMetadata = metadata.GetTiffMetadata();
- TiffFrameMetadata rootFrameMetaData = image.Frames.RootFrame.Metadata.GetTiffMetadata();
+ TiffPhotometricInterpretation rootFramePhotometricInterpretation = GetRootFramePhotometricInterpretation(image);
TiffPhotometricInterpretation photometricInterpretation = this.Mode == TiffEncodingMode.ColorPalette
- ? TiffPhotometricInterpretation.PaletteColor : rootFrameMetaData.PhotometricInterpretation;
+ ? TiffPhotometricInterpretation.PaletteColor : rootFramePhotometricInterpretation;
this.SetMode(tiffMetadata, photometricInterpretation);
this.SetBitsPerPixel(tiffMetadata);
@@ -375,5 +375,15 @@ namespace SixLabors.ImageSharp.Formats.Tiff
break;
}
}
+
+ private static TiffPhotometricInterpretation GetRootFramePhotometricInterpretation(Image image)
+ {
+ ExifProfile exifProfile = image.Frames.RootFrame.Metadata.ExifProfile;
+ TiffPhotometricInterpretation rootFramePhotometricInterpretation =
+ exifProfile?.GetValue(ExifTag.PhotometricInterpretation) != null
+ ? (TiffPhotometricInterpretation)exifProfile?.GetValue(ExifTag.PhotometricInterpretation).Value
+ : TiffPhotometricInterpretation.WhiteIsZero;
+ return rootFramePhotometricInterpretation;
+ }
}
}
diff --git a/src/ImageSharp/Formats/Tiff/TiffFormat.cs b/src/ImageSharp/Formats/Tiff/TiffFormat.cs
index ffae32093..bf0c4ebb1 100644
--- a/src/ImageSharp/Formats/Tiff/TiffFormat.cs
+++ b/src/ImageSharp/Formats/Tiff/TiffFormat.cs
@@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
///
/// Encapsulates the means to encode and decode Tiff images.
///
- public class TiffFormat : IImageFormat
+ public class TiffFormat : IImageFormat
{
private TiffFormat()
{
@@ -35,8 +35,5 @@ namespace SixLabors.ImageSharp.Formats.Tiff
///
public TiffMetadata CreateDefaultFormatMetadata() => new TiffMetadata();
-
- ///
- public TiffFrameMetadata CreateDefaultFormatFrameMetadata() => new TiffFrameMetadata();
}
}
diff --git a/src/ImageSharp/Formats/Tiff/TiffFrameMetadata.cs b/src/ImageSharp/Formats/Tiff/TiffFrameMetadata.cs
index f237ed329..b5b874063 100644
--- a/src/ImageSharp/Formats/Tiff/TiffFrameMetadata.cs
+++ b/src/ImageSharp/Formats/Tiff/TiffFrameMetadata.cs
@@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
///
/// Provides Tiff specific metadata information for the frame.
///
- public class TiffFrameMetadata : IDeepCloneable
+ internal class TiffFrameMetadata : IDeepCloneable
{
private const TiffPlanarConfiguration DefaultPlanarConfiguration = TiffPlanarConfiguration.Chunky;
diff --git a/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs
index f24ce0c64..d9ffc7897 100644
--- a/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs
+++ b/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs
@@ -6,6 +6,7 @@ using System.IO;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Tiff;
using SixLabors.ImageSharp.Formats.Tiff.Constants;
+using SixLabors.ImageSharp.Metadata.Profiles.Exif;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison;
using SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs;
@@ -49,9 +50,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
memStream.Position = 0;
using var output = Image.Load(Configuration, memStream);
TiffMetadata meta = output.Metadata.GetTiffMetadata();
- TiffFrameMetadata frameMetaData = output.Frames.RootFrame.Metadata.GetTiffMetadata();
+ ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile;
Assert.Equal(expectedBitsPerPixel, meta.BitsPerPixel);
- Assert.Equal(TiffCompression.None, frameMetaData.Compression);
+ Assert.Equal(TiffCompression.None, (TiffCompression)exifProfile.GetValue(ExifTag.Compression).Value);
}
[Theory]
@@ -73,9 +74,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
memStream.Position = 0;
using var output = Image.Load(Configuration, memStream);
TiffMetadata meta = output.Metadata.GetTiffMetadata();
- TiffFrameMetadata frameMetaData = output.Frames.RootFrame.Metadata.GetTiffMetadata();
+ ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile;
Assert.Equal(bitsPerPixel, meta.BitsPerPixel);
- Assert.Equal(TiffCompression.None, frameMetaData.Compression);
+ Assert.Equal(TiffCompression.None, (TiffCompression)exifProfile.GetValue(ExifTag.Compression).Value);
}
[Theory]
@@ -113,9 +114,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
memStream.Position = 0;
using var output = Image.Load(Configuration, memStream);
TiffMetadata meta = output.Metadata.GetTiffMetadata();
- TiffFrameMetadata frameMetaData = output.Frames.RootFrame.Metadata.GetTiffMetadata();
+ ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile;
Assert.Equal(expectedBitsPerPixel, meta.BitsPerPixel);
- Assert.Equal(expectedCompression, frameMetaData.Compression);
+ Assert.Equal(expectedCompression, (TiffCompression)exifProfile.GetValue(ExifTag.Compression).Value);
}
[Theory]
@@ -163,9 +164,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
memStream.Position = 0;
using var output = Image.Load(Configuration, memStream);
TiffMetadata meta = output.Metadata.GetTiffMetadata();
- TiffFrameMetadata frameMetaData = output.Frames.RootFrame.Metadata.GetTiffMetadata();
+ ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile;
Assert.Equal(TiffBitsPerPixel.Bit1, meta.BitsPerPixel);
- Assert.Equal(expectedCompression, frameMetaData.Compression);
+ Assert.Equal(expectedCompression, (TiffCompression)exifProfile.GetValue(ExifTag.Compression).Value);
}
[Theory]
@@ -337,7 +338,8 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
var tiffEncoder = new TiffEncoder() { Mode = mode, Compression = compression };
using Image input = provider.GetImage();
using var memStream = new MemoryStream();
- TiffFrameMetadata inputMeta = input.Frames.RootFrame.Metadata.GetTiffMetadata();
+ ExifProfile exifProfileInput = input.Frames.RootFrame.Metadata.ExifProfile;
+ var inputMeta = new TiffFrameMetadata(exifProfileInput);
// act
input.Save(memStream, tiffEncoder);
@@ -345,14 +347,15 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
// assert
memStream.Position = 0;
using var output = Image.Load(Configuration, memStream);
- TiffFrameMetadata meta = output.Frames.RootFrame.Metadata.GetTiffMetadata();
+ ExifProfile exifProfileOutput = output.Frames.RootFrame.Metadata.ExifProfile;
+ var outputMeta = new TiffFrameMetadata(exifProfileOutput);
ImageFrame rootFrame = output.Frames.RootFrame;
- Assert.True(output.Height > (int)meta.RowsPerStrip);
- Assert.True(meta.StripOffsets.Length > 1);
- Assert.True(meta.StripByteCounts.Length > 1);
+ Assert.True(output.Height > (int)outputMeta.RowsPerStrip);
+ Assert.True(outputMeta.StripOffsets.Length > 1);
+ Assert.True(outputMeta.StripByteCounts.Length > 1);
- foreach (Number sz in meta.StripByteCounts)
+ foreach (Number sz in outputMeta.StripByteCounts)
{
Assert.True((uint)sz <= TiffConstants.DefaultStripSize);
}
@@ -360,11 +363,11 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
// For uncompressed more accurate test.
if (compression == TiffCompression.None)
{
- for (int i = 0; i < meta.StripByteCounts.Length - 1; i++)
+ for (int i = 0; i < outputMeta.StripByteCounts.Length - 1; i++)
{
// The difference must be less than one row.
- int stripBytes = (int)meta.StripByteCounts[i];
- int widthBytes = (meta.BitsPerPixel + 7) / 8 * rootFrame.Width;
+ int stripBytes = (int)outputMeta.StripByteCounts[i];
+ int widthBytes = (outputMeta.BitsPerPixel + 7) / 8 * rootFrame.Width;
Assert.True((TiffConstants.DefaultStripSize - stripBytes) < widthBytes);
}
diff --git a/tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs
index 66a90418b..1c2793080 100644
--- a/tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs
+++ b/tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs
@@ -55,7 +55,8 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
{
using (Image image = provider.GetImage(TiffDecoder))
{
- TiffFrameMetadata meta = image.Frames.RootFrame.Metadata.GetTiffMetadata();
+ ExifProfile exifProfile = image.Frames.RootFrame.Metadata.ExifProfile;
+ var meta = new TiffFrameMetadata(exifProfile);
var cloneSameAsSampleMetaData = (TiffFrameMetadata)meta.DeepClone();
VerifyExpectedTiffFrameMetaDataIsPresent(cloneSameAsSampleMetaData);
@@ -168,9 +169,6 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
Assert.Equal(4, exifProfile.GetValue(ExifTag.Rating).Value);
Assert.Equal(75, exifProfile.GetValue(ExifTag.RatingPercent).Value);
- TiffFrameMetadata tiffFrameMetadata = rootFrame.Metadata.GetTiffMetadata();
- Assert.NotNull(tiffFrameMetadata);
-
ImageMetadata imageMetaData = image.Metadata;
Assert.NotNull(imageMetaData);
Assert.Equal(PixelResolutionUnit.PixelsPerInch, imageMetaData.ResolutionUnits);
@@ -182,12 +180,14 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
Assert.Equal(ByteOrder.LittleEndian, tiffMetaData.ByteOrder);
Assert.Equal(TiffBitsPerPixel.Bit4, tiffMetaData.BitsPerPixel);
+ var tiffFrameMetadata = new TiffFrameMetadata(exifProfile);
VerifyExpectedTiffFrameMetaDataIsPresent(tiffFrameMetadata);
}
}
private static void VerifyExpectedTiffFrameMetaDataIsPresent(TiffFrameMetadata frameMetaData)
{
+ Assert.NotNull(frameMetaData);
Assert.Equal(TiffBitsPerSample.Bit4, frameMetaData.BitsPerSample);
Assert.Equal(TiffCompression.Lzw, frameMetaData.Compression);
Assert.Equal(TiffPhotometricInterpretation.PaletteColor, frameMetaData.PhotometricInterpretation);
@@ -222,12 +222,12 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
Assert.Equal(2, image.Frames.Count);
- TiffFrameMetadata frame0MetaData = image.Frames[0].Metadata.GetTiffMetadata();
+ var frame0MetaData = new TiffFrameMetadata(image.Frames[0].Metadata.ExifProfile);
Assert.Equal(TiffNewSubfileType.FullImage, frame0MetaData.SubfileType);
Assert.Equal(255, image.Frames[0].Width);
Assert.Equal(255, image.Frames[0].Height);
- TiffFrameMetadata frame1MetaData = image.Frames[1].Metadata.GetTiffMetadata();
+ var frame1MetaData = new TiffFrameMetadata(image.Frames[1].Metadata.ExifProfile);
Assert.Equal(TiffNewSubfileType.Preview, frame1MetaData.SubfileType);
Assert.Equal(255, image.Frames[1].Width);
Assert.Equal(255, image.Frames[1].Height);
@@ -244,7 +244,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
ImageMetadata inputMetaData = image.Metadata;
TiffMetadata tiffMetaInput = image.Metadata.GetTiffMetadata();
- TiffFrameMetadata frameMetaInput = image.Frames.RootFrame.Metadata.GetTiffMetadata();
+ var frameMetaInput = new TiffFrameMetadata(image.Frames.RootFrame.Metadata.ExifProfile);
ImageFrame rootFrameInput = image.Frames.RootFrame;
byte[] xmpProfileInput = rootFrameInput.Metadata.XmpProfile;
ExifProfile rootFrameExifProfileInput = rootFrameInput.Metadata.ExifProfile;
@@ -264,7 +264,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
ImageMetadata encodedImageMetaData = encodedImage.Metadata;
TiffMetadata tiffMetaDataEncodedImage = encodedImageMetaData.GetTiffMetadata();
ImageFrame rootFrameEncodedImage = encodedImage.Frames.RootFrame;
- TiffFrameMetadata tiffMetaDataEncodedRootFrame = rootFrameEncodedImage.Metadata.GetTiffMetadata();
+ var tiffMetaDataEncodedRootFrame = new TiffFrameMetadata(rootFrameEncodedImage.Metadata.ExifProfile);
ExifProfile encodedImageExifProfile = rootFrameEncodedImage.Metadata.ExifProfile;
byte[] encodedImageXmpProfile = rootFrameEncodedImage.Metadata.XmpProfile;