我试图翻转一个图像垂直,检索后,从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];
}
}
}
我知道我只能迭代一半的高度并达到相同的效果,但我想通过遍历图像的完整高度来实现它。我看不出代码出了什么问题。任何帮助将不胜感激。
3条答案
按热度按时间zujrkrfu1#
我不确定图像是如何存储的,但你的索引
i
和k
被赋予了相同的步幅,这是可疑的。也许你想要i * components
和j * width * components
。在此之后,垂直反转您应该只需要将j
更改为(height - j - 1)
。wpx232ag2#
我遇到了同样的问题,OpenGL返回的像素导致了一个颠倒的位图。所以我把它们像这样翻过来但位图仍然从左到右翻转...
j7dteeu83#
使用
std::copy
或memcpy
更有效地复制整行像素使用C++
std::copy
:使用C
memcpy
:glReadPixels
之前指定了字节打包:否则你可能有一些填充/对齐问题。