首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL glReadPixels to FreeImage位图

OpenGL glReadPixels to FreeImage位图
EN

Stack Overflow用户
提问于 2017-04-26 02:30:59
回答 1查看 877关注 0票数 1

我正在尝试将呈现的输出保存到文件中。我已经将FreeImage作为依赖项使用,所以我想继续使用它。我使用glReadPixels从缓冲区读取RGB值。这些值是作为GLubytes输入到缓冲区中的,因此我想我需要这样读取它们。但是,当我运行下面的代码片段时,FreeImage_ConvertFromRawBits会调用seg错误,我不明白为什么。我咨询过医生们,似乎我做的一切都是正确的。还有其他人遇到过这个问题吗?

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-26 03:56:40

在你发完这个问题后,我看到了一点。如果我没记错的话,我想您说过您的代码片段是简化的,而不是您实际使用的代码片段。

因此,最好的猜测是您没有为pixels分配足够的内存。

下面是一个更完整的示例,用于截图并使用FreeImage保存它。

代码语言:javascript
复制
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图像,这就是为什么您的代码生成两个相同的图像。 - https://sourceforge.net/p/freeimage/discussion/36110/thread/6e51905d/

当然,这是一条旧线,所以你可以用一丝盐把它拿走。然而,我没有找到任何关于它的新的提及。当我测试的时候,改变FreeImage_ConvertFromRawBits()的口罩没有效果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43624006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档