创建每像素 8 位的 BMP 图像

Create BMP Image on 8 bits per pixel

这是我开始 C/C++ 编程以来的第二个月。我想创建一个 运行dom BMP 图像。我对创建这样一个文件的方式做了一些研究,我想出了这个代码:

#pragma pack(push,1)
struct PixelBMP
{
   uint8_t higher:4;
   uint8_t lower:4;
}pxl;
#pragma pack(pop)

#pragma pack(push,1)
struct BMPHEADER
{
    char BM[2]={'B','M'};
    uint32_t Size = 54+360000;
    uint16_t Reserved1 = 0;
    uint16_t reserved2 = 0;
    uint32_t offBits = 54;

}BMPHEADERFILE;
#pragma pack(pop)

#pragma pack(push,1)
struct BMPINFOHEADER
{
    uint32_t infoHsize = 40;
    uint32_t width = 600;
    uint32_t height = 600;
    uint16_t planes = 1;
    uint16_t bitCount = 4;
    uint32_t compression = 0;
    uint32_t biSizeImage = 0;
    uint32_t meter = 3780;
    uint32_t vertical = 3780;
    uint32_t crlUsed =0;
    uint32_t crlImp = 0;
}BMPINFOHEADERFILE;
#pragma pack(pop)

void create_bmp()
{
    FILE *output_file;
    output_file = fopen("generated_img.bmp", "wb");
    if(output_file==NULL)
    {
        perror("Error while opening the file ");
        exit(1);
    }
    fwrite(&BMPHEADERFILE, sizeof(BMPHEADERFILE), 1, output_file);
    fwrite(&BMPINFOHEADERFILE, sizeof(BMPINFOHEADERFILE), 1,output_file);
    size_t bmp_size = BMPINFOHEADERFILE.width*BMPINFOHEADERFILE.height;
    for(int i=0;i<bmp_size;i++)
    {
        pxl.lower = rand()%17;
        pxl.higher = rand()%17;

        fwrite(&pxl, sizeof(pxl),1,output_file);
    }
    fclose(output_file);
}

int main()
{
create_bmp();
return 0;
}

由于某种原因,生成的bmp文件无法打开。我从 Windows 得到一些错误。我有 windows 10 个。 PS:我也 运行 来自这个 source 的代码,当我试图打开它时它给了我同样的错误。

有人可以帮我提示一下吗? 非常感谢你!非常感谢您的宝贵时间!

更新: 我已经完成了第一次编辑,它似乎有效,生成了我的 bmp 图像。它有奇怪的颜色,但我认为它有效。 关于每像素位数,我需要使用 16 色调色板,使用 4 位模式。

  • 如果要创建每种颜色 8 位(每个像素 24 位)的位图图像, 将 BMPINFOHEADERFILE.bitCount 分配给 24,而不是 4
  • 您的 struct BMPHEADER 可能会在 char BM[2] 之后进行填充和字对齐, 这会导致位图文件格式未对齐。 为避免这种情况,请说 struct __attribute__ ((__packed__)) BMPHEADER {..}.
  • BMPHEADERFILE.Size的值应该是54+270000,而不是52+270000
  • 至于随机像素值,rand() % 17生成像素值 介于 0 和 17 之间,因为太暗而看不见。 rand() % 256 可能 在可见性方面更好。