From b0ecabbbd743e7f21874964fb0e897e2dec4159d Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Tue, 18 May 2021 18:04:10 +0200 Subject: [PATCH] Remove BitsPerPixel from TiffMetaData, its already present in TiffFrameMetadata --- .../Formats/Tiff/TiffDecoderCore.cs | 2 +- .../Tiff/TiffDecoderMetadataCreator.cs | 2 -- .../Formats/Tiff/TiffEncoderCore.cs | 26 +++++++++++-------- .../Formats/Tiff/TiffFrameMetadata.cs | 6 ++--- src/ImageSharp/Formats/Tiff/TiffMetadata.cs | 11 +------- .../Formats/Tiff/TiffEncoderTests.cs | 25 +++++++++--------- .../Formats/Tiff/TiffMetadataTests.cs | 21 +++++++-------- 7 files changed, 43 insertions(+), 50 deletions(-) diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs index b281d2453..d476f9bb7 100644 --- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs +++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs @@ -157,7 +157,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff int width = GetImageWidth(rootFrameExifProfile); int height = GetImageHeight(rootFrameExifProfile); - return new ImageInfo(new PixelTypeInfo(root.BitsPerPixel), width, height, metadata); + return new ImageInfo(new PixelTypeInfo((int)root.BitsPerPixel), width, height, metadata); } /// diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs index 337676297..d501392b0 100644 --- a/src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs +++ b/src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs @@ -33,7 +33,6 @@ namespace SixLabors.ImageSharp.Formats.Tiff TiffMetadata tiffMetadata = imageMetaData.GetTiffMetadata(); tiffMetadata.ByteOrder = byteOrder; - tiffMetadata.BitsPerPixel = GetBitsPerPixel(rootFrameMetadata); if (!ignoreMetadata) { @@ -82,7 +81,6 @@ namespace SixLabors.ImageSharp.Formats.Tiff TiffMetadata tiffMetadata = imageMetaData.GetTiffMetadata(); tiffMetadata.ByteOrder = byteOrder; - tiffMetadata.BitsPerPixel = GetBitsPerPixel(rootFrameMetadata); return imageMetaData; } diff --git a/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs index 6faab8383..f930b3c9e 100644 --- a/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs +++ b/src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs @@ -110,21 +110,25 @@ namespace SixLabors.ImageSharp.Formats.Tiff Guard.NotNull(stream, nameof(stream)); this.configuration = image.GetConfiguration(); - ImageMetadata metadata = image.Metadata; - TiffMetadata tiffMetadata = metadata.GetTiffMetadata(); + ExifProfile rootFrameExifProfile = image.Frames.RootFrame.Metadata.ExifProfile; TiffPhotometricInterpretation rootFramePhotometricInterpretation = GetRootFramePhotometricInterpretation(image); TiffPhotometricInterpretation photometricInterpretation = this.Mode == TiffEncodingMode.ColorPalette ? TiffPhotometricInterpretation.PaletteColor : rootFramePhotometricInterpretation; + TiffBitsPerPixel? rootFrameBitsPerPixel = null; + if (rootFrameExifProfile != null) + { + rootFrameBitsPerPixel = new TiffFrameMetadata(rootFrameExifProfile).BitsPerPixel; + } - this.SetMode(tiffMetadata, photometricInterpretation); - this.SetBitsPerPixel(tiffMetadata); + this.SetMode(rootFrameBitsPerPixel, photometricInterpretation); + this.SetBitsPerPixel(rootFrameBitsPerPixel); this.SetPhotometricInterpretation(); using (var writer = new TiffStreamWriter(stream)) { long firstIfdMarker = this.WriteHeader(writer); - // TODO: multiframing is not support + // TODO: multiframing is not supported this.WriteImage(writer, image, firstIfdMarker); } } @@ -264,7 +268,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff return nextIfdMarker; } - private void SetMode(TiffMetadata tiffMetadata, TiffPhotometricInterpretation photometricInterpretation) + private void SetMode(TiffBitsPerPixel? rootFrameBitsPerPixel, TiffPhotometricInterpretation photometricInterpretation) { // Make sure, that the fax compressions are only used together with the BiColor mode. if (this.CompressionType == TiffCompression.CcittGroup3Fax || this.CompressionType == TiffCompression.Ccitt1D) @@ -282,10 +286,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff } } - if (this.Mode == TiffEncodingMode.Default && tiffMetadata.BitsPerPixel != null) + if (this.Mode == TiffEncodingMode.Default && rootFrameBitsPerPixel.HasValue) { - // Preserve input bits per pixel, if no encoding mode was specified. - this.SetModeWithBitsPerPixel(tiffMetadata.BitsPerPixel, photometricInterpretation); + // Preserve input bits per pixel, if no encoding mode was specified and the input image has a bits per pixel set. + this.SetModeWithBitsPerPixel(rootFrameBitsPerPixel, photometricInterpretation); return; } @@ -319,9 +323,9 @@ namespace SixLabors.ImageSharp.Formats.Tiff } } - private void SetBitsPerPixel(TiffMetadata tiffMetadata) + private void SetBitsPerPixel(TiffBitsPerPixel? rootFrameBitsPerPixel) { - this.BitsPerPixel ??= tiffMetadata.BitsPerPixel; + this.BitsPerPixel ??= rootFrameBitsPerPixel; switch (this.Mode) { case TiffEncodingMode.BiColor: diff --git a/src/ImageSharp/Formats/Tiff/TiffFrameMetadata.cs b/src/ImageSharp/Formats/Tiff/TiffFrameMetadata.cs index e8ef6a2ff..61cce1573 100644 --- a/src/ImageSharp/Formats/Tiff/TiffFrameMetadata.cs +++ b/src/ImageSharp/Formats/Tiff/TiffFrameMetadata.cs @@ -31,7 +31,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff /// Initializes a new instance of the class. /// /// The Tiff frame directory tags. - public TiffFrameMetadata(ExifProfile frameTags) => this.Initialize(frameTags); + public TiffFrameMetadata(ExifProfile frameTags) => this.Initialize(frameTags ?? new ExifProfile()); /// /// Gets or sets a general indication of the kind of data contained in this subfile. @@ -51,7 +51,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff /// /// Gets or sets the bits per pixel. /// - public int BitsPerPixel { get; set; } + public TiffBitsPerPixel BitsPerPixel { get; set; } /// /// Gets or sets the compression scheme used on the image data. @@ -189,7 +189,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff this.BitsPerSample = bits.GetBitsPerSample(); } - this.BitsPerPixel = this.BitsPerSample.GetValueOrDefault().BitsPerPixel(); + this.BitsPerPixel = (TiffBitsPerPixel)this.BitsPerSample.GetValueOrDefault().BitsPerPixel(); } /// diff --git a/src/ImageSharp/Formats/Tiff/TiffMetadata.cs b/src/ImageSharp/Formats/Tiff/TiffMetadata.cs index 9d36d6613..cf1ab3754 100644 --- a/src/ImageSharp/Formats/Tiff/TiffMetadata.cs +++ b/src/ImageSharp/Formats/Tiff/TiffMetadata.cs @@ -19,22 +19,13 @@ namespace SixLabors.ImageSharp.Formats.Tiff /// Initializes a new instance of the class. /// /// The metadata to create an instance from. - private TiffMetadata(TiffMetadata other) - { - this.ByteOrder = other.ByteOrder; - this.BitsPerPixel = other.BitsPerPixel; - } + private TiffMetadata(TiffMetadata other) => this.ByteOrder = other.ByteOrder; /// /// Gets or sets the byte order. /// public ByteOrder ByteOrder { get; set; } - /// - /// Gets or sets the number of bits per pixel for the root frame. - /// - public TiffBitsPerPixel? BitsPerPixel { get; set; } - /// public IDeepCloneable DeepClone() => new TiffMetadata(this); } diff --git a/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs index d9ffc7897..85229a470 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs @@ -49,9 +49,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff // assert memStream.Position = 0; using var output = Image.Load(Configuration, memStream); - TiffMetadata meta = output.Metadata.GetTiffMetadata(); ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile; - Assert.Equal(expectedBitsPerPixel, meta.BitsPerPixel); + var frameMetaData = new TiffFrameMetadata(exifProfile); + Assert.Equal(expectedBitsPerPixel, frameMetaData.BitsPerPixel); Assert.Equal(TiffCompression.None, (TiffCompression)exifProfile.GetValue(ExifTag.Compression).Value); } @@ -73,9 +73,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff // assert memStream.Position = 0; using var output = Image.Load(Configuration, memStream); - TiffMetadata meta = output.Metadata.GetTiffMetadata(); ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile; - Assert.Equal(bitsPerPixel, meta.BitsPerPixel); + var frameMetaData = new TiffFrameMetadata(exifProfile); + Assert.Equal(bitsPerPixel, frameMetaData.BitsPerPixel); Assert.Equal(TiffCompression.None, (TiffCompression)exifProfile.GetValue(ExifTag.Compression).Value); } @@ -113,9 +113,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff // assert memStream.Position = 0; using var output = Image.Load(Configuration, memStream); - TiffMetadata meta = output.Metadata.GetTiffMetadata(); ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile; - Assert.Equal(expectedBitsPerPixel, meta.BitsPerPixel); + var frameMetaData = new TiffFrameMetadata(exifProfile); + Assert.Equal(expectedBitsPerPixel, frameMetaData.BitsPerPixel); Assert.Equal(expectedCompression, (TiffCompression)exifProfile.GetValue(ExifTag.Compression).Value); } @@ -140,8 +140,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff // assert memStream.Position = 0; using var output = Image.Load(Configuration, memStream); - TiffMetadata meta = output.Metadata.GetTiffMetadata(); - Assert.Equal(expectedBitsPerPixel, meta.BitsPerPixel); + ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile; + var frameMetaData = new TiffFrameMetadata(exifProfile); + Assert.Equal(expectedBitsPerPixel, frameMetaData.BitsPerPixel); } [Theory] @@ -163,9 +164,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff // assert memStream.Position = 0; using var output = Image.Load(Configuration, memStream); - TiffMetadata meta = output.Metadata.GetTiffMetadata(); ExifProfile exifProfile = output.Frames.RootFrame.Metadata.ExifProfile; - Assert.Equal(TiffBitsPerPixel.Bit1, meta.BitsPerPixel); + var frameMetaData = new TiffFrameMetadata(exifProfile); + Assert.Equal(TiffBitsPerPixel.Bit1, frameMetaData.BitsPerPixel); Assert.Equal(expectedCompression, (TiffCompression)exifProfile.GetValue(ExifTag.Compression).Value); } @@ -367,7 +368,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff { // The difference must be less than one row. int stripBytes = (int)outputMeta.StripByteCounts[i]; - int widthBytes = (outputMeta.BitsPerPixel + 7) / 8 * rootFrame.Width; + int widthBytes = ((int)outputMeta.BitsPerPixel + 7) / 8 * rootFrame.Width; Assert.True((TiffConstants.DefaultStripSize - stripBytes) < widthBytes); } @@ -376,7 +377,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff // Compare with reference. TestTiffEncoderCore( provider, - (TiffBitsPerPixel)inputMeta.BitsPerPixel, + inputMeta.BitsPerPixel, mode, inputMeta.Compression); } diff --git a/tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs index 1c2793080..a302cc110 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs @@ -35,16 +35,13 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff { var meta = new TiffMetadata { - BitsPerPixel = TiffBitsPerPixel.Bit8, ByteOrder = ByteOrder.BigEndian, }; var clone = (TiffMetadata)meta.DeepClone(); - clone.BitsPerPixel = TiffBitsPerPixel.Bit24; clone.ByteOrder = ByteOrder.LittleEndian; - Assert.False(meta.BitsPerPixel == clone.BitsPerPixel); Assert.False(meta.ByteOrder == clone.ByteOrder); } @@ -71,10 +68,10 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff } [Theory] - [InlineData(Calliphora_BiColorUncompressed, TiffBitsPerPixel.Bit1)] - [InlineData(GrayscaleUncompressed, TiffBitsPerPixel.Bit8)] - [InlineData(RgbUncompressed, TiffBitsPerPixel.Bit24)] - public void Identify_DetectsCorrectBitPerPixel(string imagePath, TiffBitsPerPixel expectedBitsPerPixel) + [InlineData(Calliphora_BiColorUncompressed, 1)] + [InlineData(GrayscaleUncompressed, 8)] + [InlineData(RgbUncompressed, 24)] + public void Identify_DetectsCorrectBitPerPixel(string imagePath, int expectedBitsPerPixel) { var testFile = TestFile.Create(imagePath); using var stream = new MemoryStream(testFile.Bytes, false); @@ -84,7 +81,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff Assert.NotNull(imageInfo); TiffMetadata tiffMetadata = imageInfo.Metadata.GetTiffMetadata(); Assert.NotNull(tiffMetadata); - Assert.Equal(expectedBitsPerPixel, tiffMetadata.BitsPerPixel); + Assert.Equal(expectedBitsPerPixel, imageInfo.PixelType.BitsPerPixel); } [Theory] @@ -178,7 +175,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff TiffMetadata tiffMetaData = image.Metadata.GetTiffMetadata(); Assert.NotNull(tiffMetaData); Assert.Equal(ByteOrder.LittleEndian, tiffMetaData.ByteOrder); - Assert.Equal(TiffBitsPerPixel.Bit4, tiffMetaData.BitsPerPixel); + + var frameMetaData = new TiffFrameMetadata(exifProfile); + Assert.Equal(TiffBitsPerPixel.Bit4, frameMetaData.BitsPerPixel); var tiffFrameMetadata = new TiffFrameMetadata(exifProfile); VerifyExpectedTiffFrameMetaDataIsPresent(tiffFrameMetadata); @@ -250,7 +249,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff ExifProfile rootFrameExifProfileInput = rootFrameInput.Metadata.ExifProfile; Assert.Equal(TiffCompression.Lzw, frameMetaInput.Compression); - Assert.Equal(TiffBitsPerPixel.Bit4, tiffMetaInput.BitsPerPixel); + Assert.Equal(TiffBitsPerPixel.Bit4, frameMetaInput.BitsPerPixel); // Save to Tiff var tiffEncoder = new TiffEncoder() { Mode = TiffEncodingMode.Rgb }; @@ -268,7 +267,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff ExifProfile encodedImageExifProfile = rootFrameEncodedImage.Metadata.ExifProfile; byte[] encodedImageXmpProfile = rootFrameEncodedImage.Metadata.XmpProfile; - Assert.Equal(TiffBitsPerPixel.Bit24, tiffMetaDataEncodedImage.BitsPerPixel); + Assert.Equal(TiffBitsPerPixel.Bit24, tiffMetaDataEncodedRootFrame.BitsPerPixel); Assert.Equal(TiffCompression.None, tiffMetaDataEncodedRootFrame.Compression); Assert.Equal(inputMetaData.HorizontalResolution, encodedImageMetaData.HorizontalResolution);