0

我已经包含了 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);

该文件有数据窗口 (-20,-20) 到 (1020,1020) 和显示窗口 (0,0) 到 (999,999)。

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

4

1 回答 1

0

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

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

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

在 32 位拱门上,整体结果被强制转换为 int32,它给出了正确的值,而在 64 位拱门上,这个值是不正确的,因为 y 是负数,不能用无符号 int32 表示。

于 2017-10-15T08:56:41.707 回答