尝试在 64 位计算机上打开 openexr 文件时 openexr 崩溃

Crash in openexr when trying to open openexr file on 64-bit machine

我在我的项目中包含了 openexr 源代码(从 http://www.openexr.com/downloads.html 下载)来解码 openexr 图像。

我已经为 64 位构建了我的项目(在 mac 以及 windows 上)并尝试打开以下文件: https://github.com/openexr/openexr-images/blob/master/ScanLines/Blobbies.exr

打开此 openexr 文件时在 openexr 源代码中崩溃。

rgbaFile = new Imf::RgbaInputFile("Blobbies.exr");

rgbaFile->setFrameBuffer(pixel - datawindow.min.x - (y * exrDimension.mWidth), 1, mWidth);

rgbaFile->readPixels(datawindow.min.y, datawindow.max.y);

这个文件有数据window(-20,-20)到(1020,1020)和显示window(0,0)到(999,999)。

我在尝试构建我的项目的 32 位版本时能够正确打开它。

我已经找到问题的原因了。 问题不在 openexr api 而在参数中 被传递给 setFrameBuffer(),即

像素 - datawindow.min.x - (y * exrDimension.mWidth)

这里y是int32类型,exrDimension.mWidth是unsigned int32类型。当这两个相乘时,会得到一个非常大的 unsigned int32 类型的值。在 setFrameBuffer 函数中接收到的表达式结果的整体类型是不同的。这取决于机器的架构。如果arch是32位的就是int32,如果是64位的arch就是int64。

在 32 位 arch 上,整体结果被类型转换为 int32,它给出了正确的值,而在 64 位 arch 上,这个值不正确,因为 y 是负数,不能用 unsigned int32 表示。