我正在尝试将呈现的输出保存到文件中。我已经将FreeImage作为依赖项使用,所以我想继续使用它。我使用glReadPixels从缓冲区读取RGB值。这些值是作为GLubytes输入到缓冲区中的,因此我想我需要这样读取它们。但是,当我运行下面的代码片段时,FreeImage_ConvertFromRawBits会调用seg错误,我不明白为什么。我咨询过医生们,似乎我做的一切都是正确的。还有其他人遇到过这个问题吗?
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);发布于 2017-04-26 03:56:40
在你发完这个问题后,我看到了一点。如果我没记错的话,我想您说过您的代码片段是简化的,而不是您实际使用的代码片段。
因此,最好的猜测是您没有为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图像,这就是为什么您的代码生成两个相同的图像。 - https://sourceforge.net/p/freeimage/discussion/36110/thread/6e51905d/
当然,这是一条旧线,所以你可以用一丝盐把它拿走。然而,我没有找到任何关于它的新的提及。当我测试的时候,改变FreeImage_ConvertFromRawBits()的口罩没有效果。
https://stackoverflow.com/questions/43624006
复制相似问题