今天我要检查一些代码。 由于该代码将在 headless PC 上运行,因此该代码将每一帧保存为单独的 RGBa 图像。 在我安装的 Ubuntu 上,我无法查看这些图像,GIMP 提示 header 损坏。 Imagemagick选项转换或显示也没有显示任何图像。
这是生成图像的代码片段:
if (act.doScreenshot || (act.doVideo && buddhabrot_animate.animating))
{
uchar4* tmpBuffer = new uchar4[env.static_env.save.imageW
* env.static_env.save.imageH];
for (int i = 0; i < env.static_env.save.imageW * env.static_env.save.imageH; i++)
{
const unsigned char tmp = tmpBuffer[i].x;
tmpBuffer[i].x = tmpBuffer[i].z;
tmpBuffer[i].z = tmp;
}
char filename[128];
FILE* fp = fopen(filename, "w+b");
BITMAPFILEHEADER bmpFH;
BITMAPINFOHEADER bmpIH;
memset(&bmpFH, 0, sizeof(bmpFH));
memset(&bmpIH, 0, sizeof(bmpIH));
bmpFH.bfType = 19778; //"BM"
bmpFH.bfSize = sizeof(bmpFH) + sizeof(bmpIH) + env.static_env.save.imageW * env.static_env.save.imageH;
bmpFH.bfOffBits = sizeof(bmpFH) + sizeof(bmpIH);
bmpIH.biSize = sizeof(bmpIH);
bmpIH.biWidth = env.static_env.save.imageW;
bmpIH.biHeight = env.static_env.save.imageH;
bmpIH.biPlanes = 1;
bmpIH.biBitCount = 32;
fwrite(&bmpFH, 1, sizeof(bmpFH), fp);
fwrite(&bmpIH, 1, sizeof(bmpIH), fp);
fwrite
(tmpBuffer,
env.static_env.save.imageW * env.static_env.save.imageH,
sizeof(uchar4),
fp);
fclose(fp);
delete[] tmpBuffer;
有什么办法可以看图片吗? 或者也许另一种将图像另存为 JPG 的方法?
最佳答案
您没有正确计算bmpFH.bfSize
,您需要将图像中的像素数乘以像素的大小 (4)。例如:
bmpFH.bfSize = sizeof(bmpFH) + sizeof(bmpIH) + env.static_env.save.imageW * env.static_env.save.imageH * sizeof(uchar4);
您还应该将 bmpIH.biCompression
初始化为 BI_RGB
。无论如何它都会起作用,因为它的值恰好为零,但最好是明确的。您可能还想取消分配给 bmpIH.biHeight
的值,因为正高度值表示自下而上的图像。
关于c - 在 Linux 上显示 RGBA32-BMP 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25488815/