From a9f6dbc68b8f09d57b5ac2d9fa08f430a322db2f Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 29 Mar 2026 17:19:46 +0200 Subject: [PATCH] Add compression to exr metadata --- src/ImageSharp/Formats/Exr/ExrDecoderCore.cs | 1 + src/ImageSharp/Formats/Exr/ExrMetadata.cs | 7 ++++++- .../Formats/Exr/ExrMetadataTests.cs | 20 ++++++++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/ImageSharp/Formats/Exr/ExrDecoderCore.cs b/src/ImageSharp/Formats/Exr/ExrDecoderCore.cs index 1127b146c5..8a893c3c83 100644 --- a/src/ImageSharp/Formats/Exr/ExrDecoderCore.cs +++ b/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; } diff --git a/src/ImageSharp/Formats/Exr/ExrMetadata.cs b/src/ImageSharp/Formats/Exr/ExrMetadata.cs index f618b6d6f9..1fa724657f 100644 --- a/src/ImageSharp/Formats/Exr/ExrMetadata.cs +++ b/src/ImageSharp/Formats/Exr/ExrMetadata.cs @@ -35,6 +35,11 @@ public class ExrMetadata : IFormatMetadata /// public ExrImageDataType ImageDataType { get; set; } = ExrImageDataType.Unknown; + /// + /// Gets or sets the compression method. + /// + public ExrCompression Compression { get; set; } = ExrCompression.None; + /// public PixelTypeInfo GetPixelTypeInfo() { @@ -92,7 +97,7 @@ public class ExrMetadata : IFormatMetadata /// 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() }; diff --git a/tests/ImageSharp.Tests/Formats/Exr/ExrMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Exr/ExrMetadataTests.cs index c94b6dce54..2cbbf0ec31 100644 --- a/tests/ImageSharp.Tests/Formats/Exr/ExrMetadataTests.cs +++ b/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); + } }