2

我正在使用 OpenEXR 库加载图像。

这工作正常,除了图像被旋转 180 度加载。我使用下面显示的循环来反转数组,但有时程序会退出并且 xcode 会给我一个 EXEC_BAD_ACCESS 错误(我认为这与 msvc 中的访问冲突相同)。它不会每次都发生,只是每5-10次发生一次。

理想情况下,我希望将数组反转到位,尽管这每次都会导致错误并且使用 memcpy 会失败但不会导致错误,只是一个空白图像。我想先知道是什么导致了这个问题。

这是我正在使用的代码:(Rgba 是 OpenEXR 中定义的 4 个“Half”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 回答