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;