【问题标题】:Create BMP Image on 8 bits per pixel以每像素 8 位创建 BMP 图像
【发布时间】:2022-01-02 06:37:10
【问题描述】:

这是我开始 C/C++ 编程以来的第二个月。我想创建一个随机的 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 位模式。

【问题讨论】:

  • “C/C++ 编程” 这样的东西不存在。你那里有纯 c 代码。如果您不使用 c++ 语言,请不要标记 c++。
  • 请注意,3 字节是每像素 24 位,而不是 8。
  • 结构体需要被打包,看起来好像你使用的是每像素 24 位,而不是 8 位。8 bpp 需要在标题之后有一个调色板表。还要注意行步长(每行必须填充为 4 个字节的倍数)。
  • @WeatherVane 非常感谢!

标签: c pixel binaryfiles bmp


【解决方案1】:
  • 如果要创建每色 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可能 在可见度方面更好。

【讨论】:

  • 感谢您的建议!唯一的事情是我想要每像素 16 位。为此,我改变了struct的定义。我将对代码进行更新以查看它。谢谢!
  • 每像素 16 位的 bmp 格式应该是灰度图像或调色板索引图像,而不是立即 RGB 值。此外,它们非常罕见。你确定吗?
  • 好吧,这是我被分配的任务。要使用包含 16 种颜色的 4 位颜色模式:-?。我用这个link 作为文档。
  • 明白。我不知道为什么你的老师会教你这种不寻常的格式,但还是祝你好运;)
  • 谢谢!我成功创建了!万事如意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2019-08-07
  • 1970-01-01
相关资源
最近更新 更多