在Linux上显示RGBA32-BMP图像

时间:2014-08-25 15:00:46

标签: c linux jpeg rgba

今天我收到了一些要审核的代码。 由于代码将在无头电脑上工作,因此代码将每个帧保存为单独的RGBa图像。 在我的Ubuntu安装上,我无法查看这些图片,GIMP抱怨标题丢失。 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的方法?

1 个答案:

答案 0 :(得分:0)

您无法正确计算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的值,因为正高度值表示自下而上的图像。