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