我正在尝试将我的渲染输出保存到文件中。我已经在使用 FreeImage 作为依赖,所以我想继续使用它。我正在使用 glReadPixels
从缓冲区读取 RGB 值。这些值作为 GLubytes 输入到缓冲区中,所以我想我需要这样读取它们。但是,当我运行以下代码片段时,FreeImage_ConvertFromRawBits
调用段错误,我不明白为什么。我咨询过the docs ,似乎我做的一切都是正确的。还有其他人遇到过这个问题吗?
GLubyte pixels[3*_winWidth*_winHeight];
glReadPixels(0, 0, _winWidth, _winHeight, GL_RGB, GL_UNSIGNED_BYTE, pixels);
FIBITMAP *bitmap = FreeImage_ConvertFromRawBits(pixels, _winWidth,
_winHeight, 3 *_winWidth, 24, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK,
FI_RGBA_BLUE_MASK, false);
最佳答案
在您发布这个问题后,我看到了一点。如果我没记错的话,我想你说过你的代码片段与你实际使用的相比是简化的。
因此,最好的猜测是您没有为像素
分配足够的内存。
这里是截取屏幕截图并使用 FreeImage 保存的更完整的示例。
BYTE *pixels = (BYTE*)malloc(width * height * 3);
glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels);
FIBITMAP *image = FreeImage_ConvertFromRawBits(pixels, width, height, 3 * width, 24, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE);
if (FreeImage_Save(FIF_BMP, image, "screenshot.bmp", 0))
printf("Successfully saved!\n");
else
printf("Failed saving!\n");
FreeImage_Unload(image);
free(pixels);
在这里您可以看到 OpenGL 和照片查看器显示相同。
最后我想起了颜色 mask 是多余的。我环顾四周,发现了这个 2005 年的帖子。
At the moment, color mask are only used for 16-bit RGB images, that's why your code produces two identical images.
这当然是一个旧话题,所以请持保留态度。然而,我无法找到任何更新的提及。在我测试时,更改 FreeImage_ConvertFromRawBits()
的掩码没有任何效果。
关于c - OpenGL glReadPixels 到 FreeImage 位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43624006/