c++ 垂直翻转图像

bqf10yzr  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(210)

我试图翻转一个图像垂直,检索后,从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];
        }
    }
}

我知道我只能迭代一半的高度并达到相同的效果,但我想通过遍历图像的完整高度来实现它。我看不出代码出了什么问题。任何帮助将不胜感激。

zujrkrfu

zujrkrfu1#

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

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

wpx232ag2#

我遇到了同样的问题,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);
}
j7dteeu8

j7dteeu83#

使用std::copymemcpy更有效地复制整行像素
使用C++ std::copy

for (size_t r = 0; r < height; r++) {
    auto src = &pixels[r*components*width];
    auto dst = &flipPixels[(height - r - 1)*components*width];
    std::copy(src, src + components*width, dst);
}

使用C memcpy

for (int r = 0; r < height; r++) {
    unsigned char *src = &pixels[r*components*width];
    unsigned char *dst = &flipPixels[(height - r - 1)*components*width];
    memcpy(dst, src, components*width);
}
  • 注意:* 这假设您在调用glReadPixels之前指定了字节打包:
glPixelStorei(GL_PACK_ALIGNMENT, 1);

否则你可能有一些填充/对齐问题。

相关问题