垂直翻转图像

时间:2014-11-03 00:12:26

标签: c++ image-processing

我正在尝试从openGL检索缓冲区后垂直翻转图像。它似乎使用以下代码输出不正确的图像:

const int width = 100;
const int height = width;
const int components = 3;
unsigned char pixels[width * height * components];
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels);
unsigned char flipPixels[width * height * components];
for (int i = 0; i < width; ++i) {
    for (int j = 0; j < height; ++j) {
        for (int k = 0; k < components; ++k) {
            flipPixels[i + j * width + k] = pixels[(height) * (width) - ((j+1) * width) + i + k];
        }
    }
}

我知道我只能迭代一半高度并实现相同,但我想通过遍历图像的完整高度来实现它。我似乎无法弄清楚代码有什么问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

我不确定图像是如何存储的,但您的索引ik具有相同的可疑步幅。也许你想要i * componentsj * width * components。之后,垂直反转您只需将j更改为(height - j - 1)

flipPixels[(i + j * width) * components + k] = pixels[(i + (height - 1 - j) * width) * components + k];

答案 1 :(得分:1)

我遇到了同样的问题,OpenGL返回的像素导致了倒置的位图。所以我像这样翻转它们:但是位图仍然从左向右翻转...

void Flip(GLubyte* pixels, int pixelbuffersize)
{
    // basically rewrites from bottom up...
    std::vector<GLubyte> flipped_pixels(pixels, pixels+pixelbuffersize);
    auto count = flipped_pixels.size();
    std::reverse(flipped_pixels.begin(), flipped_pixels.end());

    GLubyte* buff = (reinterpret_cast<GLubyte*>(&flipped_pixels[0]));
    const void * pnewdata = (const void *)buff;
    memcpy(pixels, pnewdata, count);
}