创建每像素 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
可能
在可见性方面更好。
这是我开始 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
可能 在可见性方面更好。