c - OpenGL glReadPixels 到 FreeImage 位图

标签 c opengl rendering freeimage

我正在尝试将我的渲染输出保存到文件中。我已经在使用 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 Thread, 2005

这当然是一个旧话题,所以请持保留态度。然而,我无法找到任何更新的提及。在我测试时,更改 FreeImage_ConvertFromRawBits() 的掩码没有任何效果。

关于c - OpenGL glReadPixels 到 FreeImage 位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43624006/

相关文章:

c++ - 牛顿分形生成

c++ - gluPerspective在什么情况下会看到顶点?

c# - 可以将 DirectX 表面绘制到 WPF 控件吗?

c - 如何确定一个数的有用位数?

c - 存在信号处理程序时出现段错误

c++ - Crytek SSAO 算法 OpenGL

css - Firefox 中基于旋转边框的三 Angular 形渲染

html - Firefox 有时渲染 HTML 不正确

c - 是否可以自底向上遍历文件? [C]

c++ - 使用正射投影裁剪后的边缘伪影