Browse Source

Add compression to exr metadata

pull/3096/head
Brian Popow 1 month ago
parent
commit
a9f6dbc68b
  1. 1
      src/ImageSharp/Formats/Exr/ExrDecoderCore.cs
  2. 7
      src/ImageSharp/Formats/Exr/ExrMetadata.cs
  3. 20
      tests/ImageSharp.Tests/Formats/Exr/ExrMetadataTests.cs

1
src/ImageSharp/Formats/Exr/ExrDecoderCore.cs

@ -496,6 +496,7 @@ internal sealed class ExrDecoderCore : ImageDecoderCore
this.exrMetadata = this.metadata.GetExrMetadata();
this.exrMetadata.PixelType = this.PixelType;
this.exrMetadata.ImageDataType = this.ImageDataType;
this.exrMetadata.Compression = this.Compression;
return this.HeaderAttributes;
}

7
src/ImageSharp/Formats/Exr/ExrMetadata.cs

@ -35,6 +35,11 @@ public class ExrMetadata : IFormatMetadata<ExrMetadata>
/// </summary>
public ExrImageDataType ImageDataType { get; set; } = ExrImageDataType.Unknown;
/// <summary>
/// Gets or sets the compression method.
/// </summary>
public ExrCompression Compression { get; set; } = ExrCompression.None;
/// <inheritdoc/>
public PixelTypeInfo GetPixelTypeInfo()
{
@ -92,7 +97,7 @@ public class ExrMetadata : IFormatMetadata<ExrMetadata>
/// <inheritdoc/>
public FormatConnectingMetadata ToFormatConnectingMetadata() => new()
{
EncodingType = EncodingType.Lossless,
EncodingType = this.Compression is ExrCompression.B44 or ExrCompression.B44A or ExrCompression.Pxr24 ? EncodingType.Lossy : EncodingType.Lossless,
PixelTypeInfo = this.GetPixelTypeInfo()
};

20
tests/ImageSharp.Tests/Formats/Exr/ExrMetadataTests.cs

@ -13,14 +13,16 @@ public class ExrMetadataTests
public void CloneIsDeep()
{
ExrMetadata meta = new()
{ ImageDataType = ExrImageDataType.Rgb, PixelType = ExrPixelType.Half };
{ ImageDataType = ExrImageDataType.Rgb, PixelType = ExrPixelType.Half, Compression = ExrCompression.None };
ExrMetadata clone = (ExrMetadata)meta.DeepClone();
clone.ImageDataType = ExrImageDataType.Gray;
clone.PixelType = ExrPixelType.Float;
clone.Compression = ExrCompression.Zip;
Assert.False(meta.ImageDataType.Equals(clone.ImageDataType));
Assert.False(meta.PixelType.Equals(clone.PixelType));
Assert.False(meta.Compression.Equals(clone.Compression));
}
[Theory]
@ -67,4 +69,20 @@ public class ExrMetadataTests
Assert.NotNull(metadata);
Assert.Equal(expectedImageDataType, metadata.ImageDataType);
}
[Theory]
[InlineData(TestImages.Exr.UncompressedRgba, ExrCompression.None)]
[InlineData(TestImages.Exr.B44, ExrCompression.B44)]
[InlineData(TestImages.Exr.Rle, ExrCompression.RunLengthEncoded)]
public void Identify_DetectsCorrectCompression(string imagePath, ExrCompression expectedCompression)
{
TestFile testFile = TestFile.Create(imagePath);
using MemoryStream stream = new(testFile.Bytes, false);
ImageInfo imageInfo = Image.Identify(stream);
Assert.NotNull(imageInfo);
ExrMetadata metadata = imageInfo.Metadata.GetExrMetadata();
Assert.NotNull(metadata);
Assert.Equal(expectedCompression, metadata.Compression);
}
}

Loading…
Cancel
Save