EXR Weirdness

  • Phi Hung Nguyen

    Phi Hung Nguyen - 2014-02-17


    When I do

    FREE_IMAGE_TYPE fit = FreeImage_GetImageType(fib);

    I get back FIT_RGB16. From the documentation, it says FIT_RGB16 should be treated as unsigned short. This doesn't make sense because EXR has 32 bits per channel.

    Isn't it supposed to return FIT_RGBF?
    The files I used are https://github.com/nickrasmussen/openexr-orig/tree/master/OpenEXR-images/TestImages

    Thank you.

    Last edit: Phi Hung Nguyen 2014-02-17
  • Tanner Helland

    Tanner Helland - 2014-02-18

    Hi. EXR files support 16-bit floating-point, 32-bit floating-point, and 32-bit integer per channel formats. (See http://www.openexr.com/)

    The README for the GitHub page you linked explicitly reports some images as 16-bit, e.g. "AllHalfValues.exr - The pixels in this RGB HALF image contain all 65,536 possible 16-bit floating-point numbers, including positive and negative numbers, normalized and denormalized numbers, zero, NaNs, positive infinity and negative infinity."

  • Phi Hung Nguyen

    Phi Hung Nguyen - 2014-02-18

    Hi Tanner,

    From what I can understand in your reply, FREE_IMAGE_TYPE::FIT_RGB16 can either be a 16-bit floating point value (half) or an unsigned 16-bit short?

    How would I query when it's a half versus a short? I can only find in the doc how to get BPP, RGB Mask and FREE_IMAGE_COLOR_TYPE.

    Thank you for the prompt reply.

    Last edit: Phi Hung Nguyen 2014-02-18
  • Tanner Helland

    Tanner Helland - 2014-02-19

    Hi Phi. Sorry, I'm just another FreeImage user, so my understanding is limited - I just thought I'd add my $0.02 since no one else had commented!

    For the test image "AllHalfValues.exr", I get a FREE_IMAGE_TYPE of FIT_RGBF (96-bit RGB float image), and just to double-check that, FreeImage_GetBPP also returns 96.

    For the test image "WideFloatRange.exr", I get a FREE_IMAGE_TYPE of FIT_FLOAT (single array of 32-bit floating point) and a FreeImage_GetBPP result of 32.

    Are these the same values you receive?

    In my opinion, those are the correct types for FreeImage to return (since it doesn't have a 16-bit floating-point data type). Presumably FreeImage has transparently converted the 16-bit floating point values to standard 32-bit ones.

    Unfortunately, I can't easily test if the returned image is accurate. FreeImage can only convert FIT_RGBF images to 24/32bpp (for screen display) via tone-mapping, which is great for photos but not very helpful for test images like this. When applying tone-mapping to the test images, I simply end up with a completely black image for "AllHalfValues.exr", and a completely white image for "WideFloatRange.exr".

    A simpler linear transform could be done to compare the output to something like Irfanview (which can read EXR files), but you'd have to do it manually, per this forum post: https://sourceforge.net/p/freeimage/discussion/36110/thread/4fd23e85

  • Phi Hung Nguyen

    Phi Hung Nguyen - 2014-02-20

    Hi Tanner,

    No problem. Thank you for the sanity check. It was a semantic error I got w.r.t. FIT_RGB16; everything matches now.

    The reason for wanting the 16-bit floating point (half) is that it's supported in OpenGL :)

    I was hoping FreeImage would keep the format unchanged, but this is good to know nonetheless.



Log in to post a comment.