2017-10-10 309 views
0

我已经包含了openexr源代码(从http://www.openexr.com/downloads.html下载)来解码我的项目中的openexr图像。试图在64位机器上打开openexr文件时在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位版本上尝试正确打开它。

回答

0

我找到了问题的原因。 的问题并不是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位拱形上,总体结果为类型转换为int32,它给出了正确的值,而在64位拱形中,由于y为负值,此值不正确,无法用无符号int32表示。