Browse Source

Remove PhotometricInterpretation and Compression from tiff metadata, because those are already present in the frame metadata

pull/1553/head
Brian Popow 5 years ago
parent
commit
587910f3e3
  1. 2
      src/ImageSharp/Formats/Tiff/TiffDecoderMetadataCreator.cs
  2. 10
      src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs
  3. 16
      src/ImageSharp/Formats/Tiff/TiffMetadata.cs
  4. 13
      tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs
  5. 123
      tests/ImageSharp.Tests/Formats/Tiff/TiffMetadataTests.cs

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

@ -40,8 +40,6 @@ namespace SixLabors.ImageSharp.Formats.Tiff
TiffMetadata tiffMetadata = coreMetadata.GetTiffMetadata();
tiffMetadata.ByteOrder = byteOrder;
tiffMetadata.BitsPerPixel = GetBitsPerPixel(rootFrameMetadata);
tiffMetadata.Compression = rootFrameMetadata.Compression;
tiffMetadata.PhotometricInterpretation = rootFrameMetadata.PhotometricInterpretation;
if (!ignoreMetadata)
{

10
src/ImageSharp/Formats/Tiff/TiffEncoderCore.cs

@ -112,8 +112,10 @@ 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 photometricInterpretation = rootFrameMetaData.PhotometricInterpretation;
this.SetMode(tiffMetadata);
this.SetMode(tiffMetadata, photometricInterpretation);
this.SetBitsPerPixel(tiffMetadata);
this.SetPhotometricInterpretation();
@ -265,7 +267,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
return nextIfdMarker;
}
private void SetMode(TiffMetadata tiffMetadata)
private void SetMode(TiffMetadata tiffMetadata, 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)
@ -286,7 +288,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
if (this.Mode == TiffEncodingMode.Default && tiffMetadata.BitsPerPixel != null)
{
// Preserve input bits per pixel, if no encoding mode was specified.
this.SetModeWithBitsPerPixel(tiffMetadata.BitsPerPixel, tiffMetadata.PhotometricInterpretation);
this.SetModeWithBitsPerPixel(tiffMetadata.BitsPerPixel, photometricInterpretation);
return;
}
@ -294,7 +296,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
if (this.BitsPerPixel != null)
{
// The user has specified a bits per pixel, so use that to determine the encoding mode.
this.SetModeWithBitsPerPixel(this.BitsPerPixel, tiffMetadata.PhotometricInterpretation);
this.SetModeWithBitsPerPixel(this.BitsPerPixel, photometricInterpretation);
}
}

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

@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.Formats.Tiff.Constants;
namespace SixLabors.ImageSharp.Formats.Tiff
{
@ -26,8 +25,6 @@ namespace SixLabors.ImageSharp.Formats.Tiff
{
this.ByteOrder = other.ByteOrder;
this.BitsPerPixel = other.BitsPerPixel;
this.Compression = other.Compression;
this.PhotometricInterpretation = other.PhotometricInterpretation;
this.XmpProfile = other.XmpProfile != null ? new byte[other.XmpProfile.Length] : null;
other.XmpProfile?.AsSpan().CopyTo(this.XmpProfile.AsSpan());
}
@ -38,21 +35,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff
public ByteOrder ByteOrder { get; set; }
/// <summary>
/// Gets or sets the number of bits per pixel.
/// Gets or sets the number of bits per pixel for the root frame.
/// </summary>
public TiffBitsPerPixel? BitsPerPixel { get; set; }
/// <summary>
/// Gets or sets the compression used to create the TIFF file.
/// Defaults to None.
/// </summary>
public TiffCompression Compression { get; set; } = TiffCompression.None;
/// <summary>
/// Gets or sets the photometric interpretation which indicates how the pixels are to be interpreted, e.g. if the image is bicolor, RGB, color paletted etc.
/// </summary>
public TiffPhotometricInterpretation PhotometricInterpretation { get; set; }
/// <summary>
/// Gets or sets the XMP profile.
/// For internal use only. ImageSharp not support XMP profile.

13
tests/ImageSharp.Tests/Formats/Tiff/TiffEncoderTests.cs

@ -49,8 +49,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
memStream.Position = 0;
using var output = Image.Load<Rgba32>(Configuration, memStream);
TiffMetadata meta = output.Metadata.GetTiffMetadata();
TiffFrameMetadata frameMetaData = output.Frames.RootFrame.Metadata.GetTiffMetadata();
Assert.Equal(expectedBitsPerPixel, meta.BitsPerPixel);
Assert.Equal(TiffCompression.None, meta.Compression);
Assert.Equal(TiffCompression.None, frameMetaData.Compression);
}
[Theory]
@ -72,8 +73,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
memStream.Position = 0;
using var output = Image.Load<Rgba32>(Configuration, memStream);
TiffMetadata meta = output.Metadata.GetTiffMetadata();
TiffFrameMetadata frameMetaData = output.Frames.RootFrame.Metadata.GetTiffMetadata();
Assert.Equal(bitsPerPixel, meta.BitsPerPixel);
Assert.Equal(TiffCompression.None, meta.Compression);
Assert.Equal(TiffCompression.None, frameMetaData.Compression);
}
[Theory]
@ -111,8 +113,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
memStream.Position = 0;
using var output = Image.Load<Rgba32>(Configuration, memStream);
TiffMetadata meta = output.Metadata.GetTiffMetadata();
TiffFrameMetadata frameMetaData = output.Frames.RootFrame.Metadata.GetTiffMetadata();
Assert.Equal(expectedBitsPerPixel, meta.BitsPerPixel);
Assert.Equal(expectedCompression, meta.Compression);
Assert.Equal(expectedCompression, frameMetaData.Compression);
}
[Theory]
@ -160,9 +163,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
memStream.Position = 0;
using var output = Image.Load<Rgba32>(Configuration, memStream);
TiffMetadata meta = output.Metadata.GetTiffMetadata();
TiffFrameMetadata frameMetaData = output.Frames.RootFrame.Metadata.GetTiffMetadata();
Assert.Equal(TiffBitsPerPixel.Bit1, meta.BitsPerPixel);
Assert.Equal(expectedCompression, meta.Compression);
Assert.Equal(expectedCompression, frameMetaData.Compression);
}
[Theory]

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

@ -39,24 +39,18 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
byte[] xmpData = { 1, 1, 1 };
var meta = new TiffMetadata
{
Compression = TiffCompression.Deflate,
BitsPerPixel = TiffBitsPerPixel.Bit8,
ByteOrder = ByteOrder.BigEndian,
XmpProfile = xmpData,
PhotometricInterpretation = TiffPhotometricInterpretation.Rgb
XmpProfile = xmpData
};
var clone = (TiffMetadata)meta.DeepClone();
clone.Compression = TiffCompression.None;
clone.BitsPerPixel = TiffBitsPerPixel.Bit24;
clone.ByteOrder = ByteOrder.LittleEndian;
clone.PhotometricInterpretation = TiffPhotometricInterpretation.YCbCr;
Assert.False(meta.Compression == clone.Compression);
Assert.False(meta.BitsPerPixel == clone.BitsPerPixel);
Assert.False(meta.ByteOrder == clone.ByteOrder);
Assert.False(meta.PhotometricInterpretation == clone.PhotometricInterpretation);
Assert.False(meta.XmpProfile.Equals(clone.XmpProfile));
Assert.True(meta.XmpProfile.SequenceEqual(clone.XmpProfile));
}
@ -78,44 +72,6 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
Assert.Equal(expectedBitsPerPixel, tiffMetadata.BitsPerPixel);
}
[Theory]
[InlineData(GrayscaleUncompressed, TiffCompression.None)]
[InlineData(RgbDeflate, TiffCompression.Deflate)]
[InlineData(SmallRgbLzw, TiffCompression.Lzw)]
[InlineData(Calliphora_Fax3Compressed, TiffCompression.CcittGroup3Fax)]
[InlineData(Calliphora_Fax4Compressed, TiffCompression.CcittGroup4Fax)]
[InlineData(Calliphora_HuffmanCompressed, TiffCompression.Ccitt1D)]
[InlineData(Calliphora_RgbPackbits, TiffCompression.PackBits)]
public void Identify_DetectsCorrectCompression(string imagePath, TiffCompression expectedCompression)
{
var testFile = TestFile.Create(imagePath);
using var stream = new MemoryStream(testFile.Bytes, false);
IImageInfo imageInfo = Image.Identify(this.configuration, stream);
Assert.NotNull(imageInfo);
TiffMetadata tiffMetadata = imageInfo.Metadata.GetTiffMetadata();
Assert.NotNull(tiffMetadata);
Assert.Equal(expectedCompression, tiffMetadata.Compression);
}
[Theory]
[InlineData(Calliphora_RgbUncompressed, TiffPhotometricInterpretation.Rgb)]
[InlineData(Calliphora_BiColorUncompressed, TiffPhotometricInterpretation.BlackIsZero)]
[InlineData(Calliphora_PaletteUncompressed, TiffPhotometricInterpretation.PaletteColor)]
public void Identify_DetectsCorrectPhotometricInterpretation(string imagePath, TiffPhotometricInterpretation expectedPhotometricInterpretation)
{
var testFile = TestFile.Create(imagePath);
using var stream = new MemoryStream(testFile.Bytes, false);
IImageInfo imageInfo = Image.Identify(this.configuration, stream);
Assert.NotNull(imageInfo);
TiffMetadata tiffMetadata = imageInfo.Metadata.GetTiffMetadata();
Assert.NotNull(tiffMetadata);
Assert.Equal(expectedPhotometricInterpretation, tiffMetadata.PhotometricInterpretation);
}
[Theory]
[InlineData(GrayscaleUncompressed, ByteOrder.BigEndian)]
[InlineData(LittleEndianByteOrder, ByteOrder.LittleEndian)]
@ -256,10 +212,13 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
// Load Tiff image
using Image<TPixel> image = provider.GetImage(new TiffDecoder() { IgnoreMetadata = false });
ImageMetadata coreMeta = image.Metadata;
TiffMetadata tiffMeta = image.Metadata.GetTiffMetadata();
TiffFrameMetadata frameMeta = image.Frames.RootFrame.Metadata.GetTiffMetadata();
ImageFrame<TPixel> frameRoot = image.Frames.RootFrame;
ImageMetadata inputMetaData = image.Metadata;
TiffMetadata tiffMetaInput = image.Metadata.GetTiffMetadata();
TiffFrameMetadata frameMetaInput = image.Frames.RootFrame.Metadata.GetTiffMetadata();
ImageFrame<TPixel> frameRootInput = image.Frames.RootFrame;
Assert.Equal(TiffCompression.Lzw, frameMetaInput.Compression);
Assert.Equal(TiffBitsPerPixel.Bit4, tiffMetaInput.BitsPerPixel);
// Save to Tiff
var tiffEncoder = new TiffEncoder() { Mode = TiffEncodingMode.Rgb };
@ -273,54 +232,52 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
// Assert
ms.Position = 0;
using var output = Image.Load<Rgba32>(this.configuration, ms);
using var encodedImage = Image.Load<Rgba32>(this.configuration, ms);
ImageMetadata coreMetaOut = output.Metadata;
TiffMetadata tiffMetaOut = output.Metadata.GetTiffMetadata();
TiffFrameMetadata frameMetaOut = output.Frames.RootFrame.Metadata.GetTiffMetadata();
ImageFrame<Rgba32> rootFrameOut = output.Frames.RootFrame;
ImageMetadata encodedImageMetaData = encodedImage.Metadata;
TiffMetadata tiffMetaDataEncodedImage = encodedImage.Metadata.GetTiffMetadata();
TiffFrameMetadata tiffMetaDataEncodedRootFrame = encodedImage.Frames.RootFrame.Metadata.GetTiffMetadata();
ImageFrame<Rgba32> rootFrameEncodedImage = encodedImage.Frames.RootFrame;
Assert.Equal(TiffBitsPerPixel.Bit4, tiffMeta.BitsPerPixel);
Assert.Equal(TiffBitsPerPixel.Bit24, tiffMetaOut.BitsPerPixel);
Assert.Equal(TiffCompression.Lzw, tiffMeta.Compression);
Assert.Equal(TiffCompression.None, tiffMetaOut.Compression);
Assert.Equal(TiffBitsPerPixel.Bit24, tiffMetaDataEncodedImage.BitsPerPixel);
Assert.Equal(TiffCompression.None, tiffMetaDataEncodedRootFrame.Compression);
Assert.Equal(coreMeta.HorizontalResolution, coreMetaOut.HorizontalResolution);
Assert.Equal(coreMeta.VerticalResolution, coreMetaOut.VerticalResolution);
Assert.Equal(coreMeta.ResolutionUnits, coreMetaOut.ResolutionUnits);
Assert.Equal(inputMetaData.HorizontalResolution, encodedImageMetaData.HorizontalResolution);
Assert.Equal(inputMetaData.VerticalResolution, encodedImageMetaData.VerticalResolution);
Assert.Equal(inputMetaData.ResolutionUnits, encodedImageMetaData.ResolutionUnits);
Assert.Equal(frameRoot.Width, rootFrameOut.Width);
Assert.Equal(frameRoot.Height, rootFrameOut.Height);
Assert.Equal(frameMeta.ResolutionUnit, frameMetaOut.ResolutionUnit);
Assert.Equal(frameMeta.HorizontalResolution, frameMetaOut.HorizontalResolution);
Assert.Equal(frameMeta.VerticalResolution, frameMetaOut.VerticalResolution);
Assert.Equal(frameRootInput.Width, rootFrameEncodedImage.Width);
Assert.Equal(frameRootInput.Height, rootFrameEncodedImage.Height);
Assert.Equal(frameMetaInput.ResolutionUnit, tiffMetaDataEncodedRootFrame.ResolutionUnit);
Assert.Equal(frameMetaInput.HorizontalResolution, tiffMetaDataEncodedRootFrame.HorizontalResolution);
Assert.Equal(frameMetaInput.VerticalResolution, tiffMetaDataEncodedRootFrame.VerticalResolution);
if (preserveMetadata)
{
Assert.Equal(tiffMeta.XmpProfile, tiffMetaOut.XmpProfile);
Assert.Equal(tiffMetaInput.XmpProfile, tiffMetaDataEncodedImage.XmpProfile);
Assert.Equal("IrfanView", frameMeta.ExifProfile.GetValue(ExifTag.Software).Value);
Assert.Equal("This is Название", frameMeta.ExifProfile.GetValue(ExifTag.ImageDescription).Value);
Assert.Equal("This is Изготовитель камеры", frameMeta.ExifProfile.GetValue(ExifTag.Make).Value);
Assert.Equal("This is Авторские права", frameMeta.ExifProfile.GetValue(ExifTag.Copyright).Value);
Assert.Equal("IrfanView", frameMetaInput.ExifProfile.GetValue(ExifTag.Software).Value);
Assert.Equal("This is Название", frameMetaInput.ExifProfile.GetValue(ExifTag.ImageDescription).Value);
Assert.Equal("This is Изготовитель камеры", frameMetaInput.ExifProfile.GetValue(ExifTag.Make).Value);
Assert.Equal("This is Авторские права", frameMetaInput.ExifProfile.GetValue(ExifTag.Copyright).Value);
Assert.Equal(frameMeta.ExifProfile.GetValue(ExifTag.ImageDescription).Value, frameMetaOut.ExifProfile.GetValue(ExifTag.ImageDescription).Value);
Assert.Equal(frameMeta.ExifProfile.GetValue(ExifTag.Make).Value, frameMetaOut.ExifProfile.GetValue(ExifTag.Make).Value);
Assert.Equal(frameMeta.ExifProfile.GetValue(ExifTag.Copyright).Value, frameMetaOut.ExifProfile.GetValue(ExifTag.Copyright).Value);
Assert.Equal(frameMetaInput.ExifProfile.GetValue(ExifTag.ImageDescription).Value, tiffMetaDataEncodedRootFrame.ExifProfile.GetValue(ExifTag.ImageDescription).Value);
Assert.Equal(frameMetaInput.ExifProfile.GetValue(ExifTag.Make).Value, tiffMetaDataEncodedRootFrame.ExifProfile.GetValue(ExifTag.Make).Value);
Assert.Equal(frameMetaInput.ExifProfile.GetValue(ExifTag.Copyright).Value, tiffMetaDataEncodedRootFrame.ExifProfile.GetValue(ExifTag.Copyright).Value);
}
else
{
Assert.Null(tiffMetaOut.XmpProfile);
Assert.Null(tiffMetaDataEncodedImage.XmpProfile);
Assert.Equal("ImageSharp", frameMetaOut.ExifProfile.GetValue(ExifTag.Software).Value);
Assert.Null(frameMeta.ExifProfile.GetValue(ExifTag.Software)?.Value);
Assert.Null(frameMeta.ExifProfile.GetValue(ExifTag.ImageDescription)?.Value);
Assert.Null(frameMeta.ExifProfile.GetValue(ExifTag.Make)?.Value);
Assert.Null(frameMeta.ExifProfile.GetValue(ExifTag.Copyright)?.Value);
Assert.Equal("ImageSharp", tiffMetaDataEncodedRootFrame.ExifProfile.GetValue(ExifTag.Software).Value);
Assert.Null(frameMetaInput.ExifProfile.GetValue(ExifTag.Software)?.Value);
Assert.Null(frameMetaInput.ExifProfile.GetValue(ExifTag.ImageDescription)?.Value);
Assert.Null(frameMetaInput.ExifProfile.GetValue(ExifTag.Make)?.Value);
Assert.Null(frameMetaInput.ExifProfile.GetValue(ExifTag.Copyright)?.Value);
Assert.Null(frameMetaOut.ExifProfile.GetValue(ExifTag.ImageDescription)?.Value);
Assert.Null(frameMetaOut.ExifProfile.GetValue(ExifTag.Make)?.Value);
Assert.Null(frameMetaOut.ExifProfile.GetValue(ExifTag.Copyright)?.Value);
Assert.Null(tiffMetaDataEncodedRootFrame.ExifProfile.GetValue(ExifTag.ImageDescription)?.Value);
Assert.Null(tiffMetaDataEncodedRootFrame.ExifProfile.GetValue(ExifTag.Make)?.Value);
Assert.Null(tiffMetaDataEncodedRootFrame.ExifProfile.GetValue(ExifTag.Copyright)?.Value);
}
}

Loading…
Cancel
Save