【发布时间】:2022-10-06 07:30:32
【问题描述】:
我有以下函数来加载OpenEXR image,它基本上只是从their examples复制而来:
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()方法的某个地方。我很好奇可能是什么原因,如何找到它以及如何解决问题。