我正在尝试从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];
}
}
}
我知道我只能迭代一半高度并实现相同,但我想通过遍历图像的完整高度来实现它。我似乎无法弄清楚代码有什么问题。任何帮助将不胜感激。
答案 0 :(得分:3)
我不确定图像是如何存储的,但您的索引i
和k
具有相同的可疑步幅。也许你想要i * components
和j * 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);
}