gpt4 book ai didi

在 C 中创建 BMP 文件(位图)

转载 作者:太空狗 更新时间:2023-10-29 16:34:02 25 4
gpt4 key购买 nike

我正在尝试用 C 语言制作位图,只是通过代码。我目前正在尝试制作一个非常简单的 .bmp 图像,高度为 1 像素,宽度为 4 像素,所有像素为白色。我已阅读格式说明并尝试应用它。这导致了以下代码:

char bitmap[1000];

void BMPmake()
{
// -- FILE HEADER -- //

// bitmap signature
bitmap[0] = 'B';
bitmap[1] = 'M';

// file size
bitmap[2] = 66; // 40 + 14 + 12
bitmap[3] = 0;
bitmap[4] = 0;
bitmap[5] = 0;

// reserved field (in hex. 00 00 00 00)
for(int i = 6; i < 10; i++) bitmap[i] = 0;

// offset of pixel data inside the image
for(int i = 10; i < 14; i++) bitmap[i] = 0;

// -- BITMAP HEADER -- //

// header size
bitmap[14] = 40;
for(int i = 15; i < 18; i++) bitmap[i] = 0;

// width of the image
bitmap[18] = 4;
for(int i = 19; i < 22; i++) bitmap[i] = 0;

// height of the image
bitmap[22] = 1;
for(int i = 23; i < 26; i++) bitmap[i] = 0;

// reserved field
bitmap[26] = 1;
bitmap[27] = 0;

// number of bits per pixel
bitmap[28] = 24; // 3 byte
bitmap[29] = 0;

// compression method (no compression here)
for(int i = 30; i < 34; i++) bitmap[i] = 0;

// size of pixel data
bitmap[34] = 12; // 12 bits => 4 pixels
bitmap[35] = 0;
bitmap[36] = 0;
bitmap[37] = 0;

// horizontal resolution of the image - pixels per meter (2835)
bitmap[38] = 0;
bitmap[39] = 0;
bitmap[40] = 0b00110000;
bitmap[41] = 0b10110001;

// vertical resolution of the image - pixels per meter (2835)
bitmap[42] = 0;
bitmap[43] = 0;
bitmap[44] = 0b00110000;
bitmap[45] = 0b10110001;

// color pallette information
for(int i = 46; i < 50; i++) bitmap[i] = 0;

// number of important colors
for(int i = 50; i < 54; i++) bitmap[i] = 0;

// -- PIXEL DATA -- //
for(int i = 54; i < 66; i++) bitmap[i] = 0;
}

void BMPwrite()
{
FILE *file;
file = fopen("bitmap.bmp", "w+");
for(int i = 0; i < 66; i++)
{
fputc(bitmap[i], file);
}
fclose(file);
}

当我尝试打开这张图片时,它说图片已损坏。我在这里遗漏了什么吗?

我还注意到 .bmp 整数的编码是小端。我认为这意味着我必须颠倒字节的顺序。例如,4 个字节的 256 是:00000000 00000000 00000001 00000000,我认为在小端中这将是:00000000 00000001 00000000 00000000

有人可以帮我吗?我使用的方法正确吗?任何帮助将不胜感激!

提前致谢!

最佳答案

您的像素偏移量(字节 10..13)为零,但像素数据实际上并不从文件的开头开始,它们从字节 54 开始。

还有:

  • 您对字节 34 的评论说“位”,但意思是“字节”,当然这无关紧要。

  • 您的水平和垂直分辨率的字节顺序错误,但我非常怀疑这是否重要。

如果我这样做,我会为 header 数据定义结构(实际上,如果您使用的是 Windows,Microsoft 已经这样做了)并使用宏或其他东西将字节以可移植的方式放入正确的顺序。

您是否“必须颠倒字节顺序”取决于您使用的处理器的字节顺序。正如您所做的那样,分别写入单独的字节是避免担心这一点的有效方法。

关于在 C 中创建 BMP 文件(位图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11004868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com