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

标签 c bitmap bmp

我正在尝试用 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/

相关文章:

c - 预处理器宏定义是否需要在头文件中大写?

c - 何时将 malloc 用于函数内的静态指针?

java - 就地复制位图会泄漏内存吗?

java - Android 应用程序 - 从 Activity 绘制位图

c中的颜色变化bmp

c - 为什么在这两个测试用例中我的输出是错误的?

c - 声明一个不返回任何内容且没有任何参数的函数是否合法?

android - Android 中的 BitmapFactory.decodeFile 和 ImageView 奇怪的东西

BMP 图像头 - biXPelsPerMeter

c - 在 C 中解析/读取位图文件