【问题标题】:OpenGL glReadPixels to FreeImage bitmapOpenGL glReadPixels 到 FreeImage 位图
【发布时间】:2017-04-26 02:30:59
【问题描述】:

我正在尝试将渲染的输出保存到文件中。我已经在使用 FreeImage 作为依赖项,所以我想继续使用它。我正在使用glReadPixels 从缓冲区中读取 RGB 值。这些值作为 GLubytes 输入缓冲区,所以我想我需要这样读取它们。但是,当我运行以下代码 sn-p 时,FreeImage_ConvertFromRawBits 调用 seg 错误,我不明白为什么。我咨询了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);

【问题讨论】:

  • @genpfault:我之前也遇到过同样的问题,虽然你是对的,但绝对应该切换回去
  • 是的,here ya go,请随意使用它来构建。
  • 我试试看,谢谢!
  • 警告,您对FreeImage_ConvertFromRawBits 的调用似乎是错误的:FreeImage_ConvertFromRawBits(pixels, _winWidth, _winWidth ,...
  • @purplepsycho:哎呀,打错了,谢谢!它之所以有效,是因为我有 1024x1024 图像

标签: c opengl rendering freeimage


【解决方案1】:

我在你发布这个问题后看到了一点。如果我没记错的话,我想你说你的 sn-p 与你实际使用的相比被简化了。

因此,最好的猜测是您没有为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 年的帖子。

目前,颜色掩码仅用于 16 位 RGB 图像,这就是您的代码生成两个相同图像的原因。

FreeImage Thread, 2005

这当然是一个旧线程,所以请谨慎对待。但是,我找不到任何更新的提及。在我测试时,更改 FreeImage_ConvertFromRawBits() 的掩码没有效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多