我有以下功能来加载OpenEXR 图像,基本上只是从他们的示例中复制的:
void HDrRenderer::ReadExrImage(
const char fileName[],
Imf::Array2D<half>& rPixels,
Imf::Array2D<half>& gPixels,
Imf::Array2D<float>& zPixels,
int& width, int& height)
{
Imf::InputFile file(fileName);
auto header = file.header();
Imath::Box2i dw = header.dataWindow();
width = dw.max.x - dw.min.x + 1;
height = dw.max.y - dw.min.y + 1;
rPixels.resizeErase(height, width);
gPixels.resizeErase(height, width);
zPixels.resizeErase(height, width);
Imf::FrameBuffer frameBuffer;
frameBuffer.insert("R",
Imf::Slice(Imf::HALF,
(char*)(&rPixels[0][0] - dw.min.x - dw.min.y * width),
sizeof(rPixels[0][0]) * 1,
sizeof(rPixels[0][0]) * width,
1, 1, 0.0));
frameBuffer.insert("G",
Imf::Slice(Imf::HALF,
(char*)(&gPixels[0][0] - dw.min.x - dw.min.y * width),
sizeof(gPixels[0][0]) * 1,
sizeof(gPixels[0][0]) * width,
1, 1, 0.0));
frameBuffer.insert("Z",
Imf::Slice(Imf::FLOAT,
(char*)(&zPixels[0][0] - dw.min.x - dw.min.y * width),
sizeof(zPixels[0][0]) * 1,
sizeof(zPixels[0][0]) * width,
1, 1, FLT_MAX));
file.setFrameBuffer(frameBuffer);
file.readPixels(dw.min.y, dw.max.y);
}
我的问题很简单:任何FrameBuffer.insert()
方法都会使程序崩溃,并显示以下消息:
在 MyAwesomeProgram.exe 中的 0x00007FFDE6BFC1AE (OpenEXR-3_1.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x0000000000000019。
我已经尝试过分离Slice
-> 问题确实出在insert()
方法的某个地方。我很好奇可能是什么原因,如何找到它以及如何解决问题。