【发布时间】: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