c - 在 Linux 上显示 RGBA32-BMP 图像

标签 c linux jpeg rgba

今天我要检查一些代码。 由于该代码将在 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/

相关文章:

c - 带参数的宏

c++ - 请建议一个用户模式文件系统过滤器框架

c - C语言建立二叉树时出现段错误

Php shell_exec 无法运行 mysql 命令?

linux - grep 当前日期到 7 天前没有具体日期

java - Delphi 到 Java 代码的转换

c - 如果它是结构成员,如何打印 void 指针的值

linux - 如何配置 logstash 以使用 "stdout"作为输入?

android - 直接从字节数组裁剪图像

r - 使用 R 中的 jpeg 包检测无效或损坏的 jpg 文件