Conversation
# Conflicts: # src/ImageSharp/Configuration.cs
# Conflicts: # src/ImageSharp/Formats/Bmp/BmpConstants.cs # src/ImageSharp/Formats/Bmp/BmpDecoder.cs # src/ImageSharp/Formats/Bmp/BmpFormat.cs
# Conflicts: # src/ImageSharp/Configuration.cs # src/ImageSharp/Formats/Bmp/BmpArrayFileHeader.cs # src/ImageSharp/Formats/Bmp/BmpConstants.cs # src/ImageSharp/Formats/Bmp/BmpFormat.cs # src/ImageSharp/Formats/Bmp/BmpImageFormatDetector.cs # src/ImageSharp/Formats/ImageExtensions.Save.cs # src/ImageSharp/Formats/Pbm/BufferedReadStreamExtensions.cs # tests/ImageSharp.Tests/ConfigurationTests.cs # tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs
# Conflicts: # src/ImageSharp/Configuration.cs # src/ImageSharp/Formats/Bmp/BmpArrayFileHeader.cs # src/ImageSharp/Formats/Bmp/BmpConstants.cs # src/ImageSharp/Formats/Bmp/BmpDecoder.cs # src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs # src/ImageSharp/Formats/Bmp/BmpFileHeader.cs # src/ImageSharp/Formats/Bmp/BmpFormat.cs # src/ImageSharp/Formats/Bmp/BmpImageFormatDetector.cs # src/ImageSharp/Formats/Bmp/BmpInfoHeader.cs # src/ImageSharp/Formats/ImageDecoderUtilities.cs # src/ImageSharp/Formats/ImageExtensions.Save.cs # src/ImageSharp/Formats/Pbm/BufferedReadStreamExtensions.cs # src/ImageSharp/Image.Decode.cs # tests/ImageSharp.Tests/ConfigurationTests.cs # tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs
# Conflicts: # src/ImageSharp/Formats/Bmp/BmpFormat.cs # src/ImageSharp/Formats/ImageDecoderUtilities.cs # src/ImageSharp/Formats/ImageExtensions.Save.cs # src/ImageSharp/Formats/OpenExr/ExrDecoderCore.cs
# Conflicts: # src/ImageSharp/Configuration.cs # src/ImageSharp/Formats/ImageDecoderUtilities.cs # tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Formats.cs
src/ImageSharp/Formats/Exr/Compression/Decompressors/B44ExrCompression.cs
Fixed
Show fixed
Hide fixed
|
@brianpopow I'll review this asap. |
| /// <param name="component">The 32 bit component value.</param> | ||
| /// <returns>The <see cref="byte"/> value.</returns> | ||
| [MethodImpl(MethodImplOptions.AggressiveInlining)] | ||
| public static byte From32BitTo8Bit(uint component) => (byte)(component * Scale32Bit); |
There was a problem hiding this comment.
Perf is maybe not a primary concern at this point but I wonder if there is a cheaper way to correctly calculate this that avoids FP conversion? How does the reference implementation calculate this (if they care about decoding into lower res format)?
There was a problem hiding this comment.
@brianpopow actually, I don't understand this. From32BitTo8Bit(uint.MaxValue) == 1. Are you sure this logic is correct? If it's incorrect, I wonder why tests didn't catch it? Wouldn't (byte)(component >> 16) do the job?
There was a problem hiding this comment.
@antonfirsov Yes I think you are right, this does not look right.
I wonder why tests didn't catch it?
There are no pixel conversion tests yet for the new pixel types. I will try to add tests for the new pixlel types Rgb96 and Rgba128 next.
Wouldn't (byte)(component >> 16) do the job?
Yeah that's more like it, but I think it should be (byte)(component >> 24)? Lets say we have for example Int.Max / 2, e.g. 2147483647. Converting this to 8 bit should be 127.
src/ImageSharp/Formats/Exr/Compression/Decompressors/NoneExrCompression.cs
Outdated
Show resolved
Hide resolved
|
@brianpopow I'll be able to focus on a proper review this week. |
| } | ||
|
|
||
| /// <inheritdoc/> | ||
| public override ExrCompression Method => ExrCompression.Zip; |
| /// </para> | ||
| /// </summary> | ||
| [StructLayout(LayoutKind.Sequential)] | ||
| public partial struct Rgba128 : IPixel<Rgba128>, IEquatable<Rgba128> |
There was a problem hiding this comment.
Doesn't this mean our processes are all actually lossy?
| PixelAlphaRepresentation.Unassociated); | ||
|
|
||
| /// <inheritdoc/> | ||
| public readonly Rgba32 ToRgba32() => throw new NotImplementedException(); |
There was a problem hiding this comment.
We need to implement all these.
| See https://github.com/ImageMagick/ImageMagick/commit/27a0a9c37f18af9c8d823a3ea076f600843b553c | ||
| --> | ||
| <PackageReference Update="Magick.NET-Q16-AnyCPU" Version="13.10.0" /> | ||
| <PackageReference Update="Magick.NET-Q16-AnyCPU" Version="14.11.1" /> |
There was a problem hiding this comment.
Oh, you got this working!! Fantastic!! 🙌
There was a problem hiding this comment.
I had to upgrade to the latest version of Magick.NET, because of an issue decoding some exr files, which was fixed here
Unfortunately this also changed how some bitmaps which are RLE compressed are decoded. I had to change some testcases to use CompareToReferenceOutput instead of using the reference decoder: 0c3ca3d
| for (int i = 1; i < predicted.Length; i++) | ||
| { | ||
| int d = (predicted[i] - p + 128 + 256) & 255; | ||
| p = predicted[i]; |
|
|
||
| if (totalRead == 0) | ||
| { | ||
| ExrThrowHelper.ThrowInvalidImageContentException("Could not read zip compressed image data!"); |
There was a problem hiding this comment.
I wonder if we should just break here? Normally we try to return as much pixel information as we can.
|
|
||
| namespace SixLabors.ImageSharp.Formats.Exr.Compression; | ||
|
|
||
| internal abstract class ExrBaseDecompressor : ExrBaseCompression |
There was a problem hiding this comment.
I know these types are internal but I'm finding it very useful currently to document the crap out of everything (AI really helps here.)
@JimBobSquarePants: dont worry keep your time, it is not urgent. Just as a heads up: I noticed issues with the pixel conversion methods introduced with the new pixel types. I am trying to add tests for them in the next days. Those conversion methods will change, so maybe exclude them from a review until then, because they will change anyway. |
Prerequisites
Description
This PR adds support for decoding and encoding of images in the OpenEXR format. OpenEXR is a HDR image format, therefore I have added two new pixel formats
Rgb96andRgba128which store each color channel asUInt32.The specification can be found here: https://openexr.com/en/latest/index.html#openexr
A reference implementation can be found here: https://github.com/AcademySoftwareFoundation/openexr.git