0

我有以下功能来加载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()方法的某个地方。我很好奇可能是什么原因,如何找到它以及如何解决问题。

4

0 回答 0