2

OpenEXR ライブラリを使用してイメージをロードしています。

これは正常に機能しますが、画像が 180 度回転して読み込まれます。以下に示すループを使用して配列を逆にしますが、プログラムが終了し、xcode で EXEC_BAD_ACCESS エラーが発生することがあります (これは msvc のアクセス違反と同じだと思います) 毎回ではなく、5~10回に1回程度です。

理想的には、配列を逆にしたいのですが、それは毎回エラーにつながり、memcpy の使用は失敗しますが、エラーは発生せず、空白の画像になります。まず、この問題の原因を知りたいです。

ここに私が使用しているコードがあります: (Rgba は、OpenEXR で定義された 4 つの「半分」の sr、g、b、および a の構造体です)

Rgba* readRgba(const char filename[], int& width, int& height){
    Rgba* pixelBuffer = new Rgba[width * height];
    Rgba* temp = new Rgba[width * height];

    // ....EXR Loading code....

    // TODO: *Sometimes* the following code results in a bad memory access error. No idea why.
    // Flip the image to conform with OpenGL coordinates.
    for (int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j];
        }
    }

        delete pixelBuffer;

        return temp;
}

前もって感謝します!

4

2 に答える 2

4

変化する:

        temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j];

に:

        temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j - 1];

(ヒント: i = 0 かつ j = 0 の場合に何が起こるか考えてみてください!)

于 2010-07-25T12:12:25.010 に答える
1

そして、このコードを最適化してメモリを節約し、サイクルを実現する方法は次のとおりです。

 Rgba* readRgba(const char filename[], int& width, int& height)
 {
    Rgba* pixelBuffer = new Rgba[width * height];
    Rgba tempPixel;

    // ....EXR Loading code....

    // Flip the image to conform with OpenGL coordinates.
    for (int i = 0; i <= height/2; i++)
      for(int j = 0; j < width && (i*width + j) <= (height*width/2); j++)
      {
        tempPixel =  pixelBuffer[i*width + j];
        pixelBuffer[i*width + j] = pixelBuffer[height*width - (i*width + j) -1];
        pixelBuffer[height*width - (i*width + j) -1] = tempPixel;
      }

    return pixelBuffer;
 }

(メモリ使用のベスト プラクティスの観点から) 最適なのは、pixelBuffer* をパラメーターとして渡し、既に割り当てられていることに注意してください。同じコードでメモリの割り当てと解放を行うことをお勧めします。

于 2010-07-25T13:15:57.103 に答える