OpenGL glReadPixels 到 FreeImage 位图

OpenGL glReadPixels to FreeImage bitmap

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

你发了这个问题我才看到一点。如果我没记错的话,我想你说过你的代码片段与你实际使用的相比是简化的。

因此最好的猜测是您没有为 pixels.

分配足够的内存

这里是截取屏幕截图并使用 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 和照片查看器显示相同。

最后我想起了一些关于颜色蒙版多余的事情。我环顾四周,发现了这个 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() 的掩码没有效果。