• BMP编程实践1:C语言实现bmp位图分析与创建


    前言

            本次实验使用的BMP图片是256位的灰度图片。

            本次实验分两步,第一个源码是读图片信息,第二个源码是生成图片。这种操作适用于已知一个图片的格式,然后生成一个和它一样的图片的格式,例如给带屏的单片机截屏,保存图片。

           

    一 BMP图片头解析

             位图文件可看成由 4 个部分组成:位图文件头(BITMAPFILEHEADER)、位图信息头(BITMAPINFOHEADER)、调色板(Palette)也叫彩色表(color table)和定义位图的字节阵列,下面会逐个介绍。

    第一部分

    第一部分为位图文件头 BITMAPFILEHEADER ,是一个结构,其定义如下:
    1. typedef uint16_t WORD;
    2. typedef uint32_t DWORD;
    3. typedef struct tagBITMAPFILEHEADER{
    4. WORD bfType;//2
    5. DWORD bfSize;//4
    6. WORD bfReserved1;//2
    7. WORD bfReserved2;//2
    8. DWORD bfOffBits;//4
    9. } BITMAPFILEHEADER;
            这个结构的长度是固定的,为 14 个字节( WORD 为无符号 16 位整数, DWORD 为无符号32 位整数),各个域的说明如下:
    bfType
            指定文件类型,必须是 0x424D ,即字符串 "BM" ,也就是说所有 .bmp 文件的头两个字节都 是"BM"
    bfSize
            指定文件大小,包括这 14 个字节
    bfReserved1 bfReserved2
                    为保留字,不用考虑
    bfOffBits
            为从文件头到实际的位图数据的偏移字节数, 前三个部分的长度之和

    第二部分

            第二部分为位图信息头 BITMAPINFOHEADER,也是一个结构,其定义如下:

    1. typedef uint16_t WORD;
    2. typedef uint32_t DWORD;
    3. typedef uint32_t LONG;
    4. typedef struct tagBITMAPINFOHEADER{
    5. DWORD biSize;
    6. LONG biWidth;
    7. LONG biHeight;
    8. WORD biPlanes;
    9. WORD biBitCount;
    10. DWORD biCompression;
    11. DWORD biSizeImage;
    12. LONG biXPelsPerMeter;
    13. LONG biYPelsPerMeter;
    14. DWORD biClrUsed;
    15. DWORD biClrImportant;
    16. } BITMAPINFOHEADER;

            这个结构的长度是固定的,为 40 个字节(WORD 为无符号 16 位整数,DWORD 无符号 32 位整数,LONG 32 位整数),各个域的说明如下:

    biSize
            指定这个结构的长度,为 40
    biWidth
            指定图象的宽度,单位是象素
    biHeight
            指定图象的高度,单位是象素
    biPlanes
            必须是 1 ,不用考虑
    biBitCount

            指定表示颜色时要用到的位数,常用的值为 1(黑白二色图),416 色图),8256 色),24

    (真彩色图)(新的 .bmp 格式支持 32 位色,这里就不做讨论了)。
    biCompression
            指定位图是否压缩,有效的值为 BI_RGB BI_RLE8 BI_RLE4 BI_BITFIELDS(都是一 些 Windows 定义好的常量)。要说明的是, Windows 位图可以采用 RLE4 ,和 RLE8 的压缩 格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即 biCompression 为BI_RGB 的情况。
    biSizeImage
            指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:
    biSizeImage=biWidth'*biHeight
            要注意的是:上述公式中的 biWidth' 必须是 4 的整倍数(所以不是 biWidth ,而是 biWidth', 表示大于或等于 biWidth 的,离 4 最近的整倍数。举个例子,如果 iWidth=240,则 biWidth'=240 ;如果 biWidth=241 biWidth'=244 )如果 biCompression BI_RGB,则该项可能为零
    biXPelsPerMeter
            指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念,我们将在打印部 分详细介绍。
    biYPelsPerMeter
            指定目标设备的垂直分辨率,单位同上。
    biClrUsed
            指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为 2 biBitCount 次方。
    biClrImportant
            指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。

    第三部分-调色板

            第三部分为调色板(Palette),当然,这里是对那些需要调色板的位图文件而言的。有些位图, 如真彩色图,前面已经讲过,是不需要调色板的,BITMAPINFOHEADER 后直接是位图数据。调色板实际上是一个数组,共有 biClrUsed 个元素(如果该值为零,则有 2 biBitCount 方个元素)。数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节,其定义如下:

    1. typedef uint8_t BYTE;
    2. typedef struct tagRGBQUAD{
    3. BYTE rgbBlue; //该颜色的蓝色分量
    4. BYTE rgbGreen; //该颜色的绿色分量
    5. BYTE rgbRed; //该颜色的红色分量
    6. BYTE rgbReserved; //保留值
    7. } RGBQUAD;

    第四部分

            第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该像素颜在调色板
    中的索引值,对于真彩色图,图象数据就是实际的 R,G,B 值。下面就 2 色, 16 色, 256 色位
    图和真彩色位图分别介绍。对于 2 色位图,用 1 位就可以表示该像素的颜色(一般 0 表示黑, 1 表示白),所以一个字节可以表示 8 个像素。对于 16 色位图,用 4 位可以表示一个像素的颜色,所以一个字节可以表示 2 个像素。对于 256 色位图,一个字节刚好可以表示 1 个像素。对于真彩色图,三个字节才能表示 1 个像素。
            要注意两点:
            1.每一行的字节数必须是 4 的整倍数,如果不是,则需要补齐。这在前面介绍 biSizeImage
    时已经提到了。
            2.一般来说, .BMP 文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的
    是图象最下面一行的左边第一个像素,然后是左边第二个像素…接下来是倒数第二行左边第
    一个像素,左边第二个像素…依次类推,最后得到的是最上面一行的最右一个像素。
    好了,终于介绍完 bmp 文件结构了,是不是觉得头有些大。

    二 实践

            还是不知道应该怎么设置怎么办,调色板也不知道应该怎么设置。找一个目标图片,读出它的内部数据,然后将他们一个一个的赋值给新图片。

    读图片的参数源码

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. char buf[1024];
    10. typedef uint16_t WORD;
    11. typedef uint32_t DWORD;
    12. #pragma pack(1)
    13. typedef struct tagBITMAPFILEHEADER{
    14. WORD bfType;//2
    15. DWORD bfSize;//4
    16. WORD bfReserved1;//2
    17. WORD bfReserved2;//2
    18. DWORD bfOffBits;//4
    19. } BITMAPFILEHEADER;
    20. #pragma pack()
    21. typedef uint32_t LONG;
    22. #pragma pack(1)
    23. typedef struct tagBITMAPINFOHEADER{
    24. DWORD biSize;
    25. LONG biWidth;
    26. LONG biHeight;
    27. WORD biPlanes;
    28. WORD biBitCount;
    29. DWORD biCompression;
    30. DWORD biSizeImage;
    31. LONG biXPelsPerMeter;
    32. LONG biYPelsPerMeter;
    33. DWORD biClrUsed;
    34. DWORD biClrImportant;
    35. } BITMAPINFOHEADER;
    36. #pragma pack()
    37. void show_bit_map_file_header(BITMAPFILEHEADER *p)
    38. {
    39. printf("bfType=%04x\n",p->bfType);
    40. printf("bfSize=%d\n",p->bfSize);
    41. printf("bfReserved1=%d\n",p->bfReserved1);
    42. printf("bfReserved2=%d\n",p->bfReserved2);
    43. printf("bfOffBits=%d\n",p->bfOffBits);
    44. }
    45. void show_bit_map_info_header(BITMAPINFOHEADER *p)
    46. {
    47. printf("biSize=%d\n",p->biSize);
    48. printf("biWidth=%d\n",p->biWidth);
    49. printf("biHeight=%d\n",p->biHeight);
    50. printf("biPlanes=%d\n",p->biPlanes);
    51. printf("biBitCount=%d\n",p->biBitCount);
    52. printf("biCompression=%d\n",p->biCompression);
    53. printf("biSizeImage=%d\n",p->biSizeImage);
    54. printf("biXPelsPerMeter=%d\n",p->biXPelsPerMeter);
    55. printf("biYPelsPerMeter=%d\n",p->biYPelsPerMeter);
    56. printf("biClrUsed=%d\n",p->biClrUsed);
    57. printf("biClrImportant=%d\n",p->biClrImportant);
    58. }
    59. void show_bmp_info(char *name)
    60. {
    61. BITMAPFILEHEADER bit_map_file_header;
    62. BITMAPINFOHEADER bit_map_info_header;
    63. int fd = 0;
    64. int i = 0;
    65. fd = open(name,O_RDONLY);
    66. if(fd < 0){
    67. perror("open");
    68. return;
    69. }
    70. printf("open %s ok \n",name);
    71. read(fd,&bit_map_file_header,sizeof(bit_map_file_header));
    72. read(fd,&bit_map_info_header,sizeof(bit_map_info_header));
    73. show_bit_map_file_header(&bit_map_file_header);
    74. show_bit_map_info_header(&bit_map_info_header);
    75. read(fd,buf,1024);
    76. for(i = 0;i < 1024;i++){
    77. if(i > 0 && i%16 == 0){
    78. printf("\n");
    79. }
    80. printf("0x%02x,",(uint8_t)buf[i]);
    81. }
    82. printf("\n");
    83. close(fd);
    84. }
    85. int main(int argc,char *argv[])
    86. {
    87. show_bmp_info("2.bmp");
    88. return 0;
    89. }

            运行结果:

            输出信息里面的那一堆的0x十六进制数据是调色板,这个图片的调色板是1024字节,怎么知道是1024字节?我提前计算的。这个图片大小是1025078 - 54(图片头)-1280*800(图片数组)= 1024;1024就是调色板大小了。

            再分析一下为什么是1024个字节呢?调色板实际上是一个数组,共有 biClrUsed 个元素,下面的输出中,biClrUsed的值是256。数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节。所以是biClrUsed * sizeof(RGBQUAD) = 256 * 4 = 1024字节。

    1. open 2.bmp ok
    2. bfType=4d42
    3. bfSize=1025078
    4. bfReserved1=0
    5. bfReserved2=0
    6. bfOffBits=1078
    7. biSize=40
    8. biWidth=1280
    9. biHeight=800
    10. biPlanes=1
    11. biBitCount=8
    12. biCompression=0
    13. biSizeImage=1024000
    14. biXPelsPerMeter=5669
    15. biYPelsPerMeter=5669
    16. biClrUsed=256
    17. biClrImportant=256
    18. 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,
    19. 0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,
    20. 0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,
    21. 0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,
    22. 0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,
    23. 0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,
    24. 0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,
    25. 0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,
    26. 0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,
    27. 0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,
    28. 0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,
    29. 0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,
    30. 0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,
    31. 0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,
    32. 0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,
    33. 0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,
    34. 0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,
    35. 0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,
    36. 0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,
    37. 0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,
    38. 0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,
    39. 0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,
    40. 0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,
    41. 0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,
    42. 0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,
    43. 0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,
    44. 0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,
    45. 0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,
    46. 0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,
    47. 0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,
    48. 0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,
    49. 0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,
    50. 0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,
    51. 0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,
    52. 0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,
    53. 0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,
    54. 0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,
    55. 0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,
    56. 0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,
    57. 0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,
    58. 0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,
    59. 0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,
    60. 0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,
    61. 0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,
    62. 0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,
    63. 0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,
    64. 0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,
    65. 0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,
    66. 0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,
    67. 0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,
    68. 0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,
    69. 0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,
    70. 0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,
    71. 0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,
    72. 0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,
    73. 0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,
    74. 0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,
    75. 0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,
    76. 0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,
    77. 0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,
    78. 0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,
    79. 0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,
    80. 0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,
    81. 0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,

    生成一个图片的代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #define IMAGE_SIZE 1280*800
    10. char read_buf[IMAGE_SIZE];
    11. typedef uint16_t WORD;
    12. typedef uint32_t DWORD;
    13. #pragma pack(1)
    14. typedef struct tagBITMAPFILEHEADER{
    15. WORD bfType;//2
    16. DWORD bfSize;//4
    17. WORD bfReserved1;//2
    18. WORD bfReserved2;//2
    19. DWORD bfOffBits;//4
    20. } BITMAPFILEHEADER;
    21. #pragma pack()
    22. typedef uint32_t LONG;
    23. #pragma pack(1)
    24. typedef struct tagBITMAPINFOHEADER{
    25. DWORD biSize;
    26. LONG biWidth;
    27. LONG biHeight;
    28. WORD biPlanes;
    29. WORD biBitCount;
    30. DWORD biCompression;
    31. DWORD biSizeImage;
    32. LONG biXPelsPerMeter;
    33. LONG biYPelsPerMeter;
    34. DWORD biClrUsed;
    35. DWORD biClrImportant;
    36. } BITMAPINFOHEADER;
    37. static char color_board[] = {
    38. 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,
    39. 0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,
    40. 0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,
    41. 0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,
    42. 0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,
    43. 0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,
    44. 0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,
    45. 0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,
    46. 0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,
    47. 0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,
    48. 0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,
    49. 0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,
    50. 0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,
    51. 0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,
    52. 0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,
    53. 0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,
    54. 0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,
    55. 0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,
    56. 0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,
    57. 0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,
    58. 0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,
    59. 0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,
    60. 0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,
    61. 0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,
    62. 0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,
    63. 0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,
    64. 0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,
    65. 0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,
    66. 0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,
    67. 0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,
    68. 0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,
    69. 0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,
    70. 0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,
    71. 0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,
    72. 0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,
    73. 0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,
    74. 0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,
    75. 0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,
    76. 0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,
    77. 0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,
    78. 0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,
    79. 0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,
    80. 0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,
    81. 0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,
    82. 0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,
    83. 0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,
    84. 0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,
    85. 0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,
    86. 0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,
    87. 0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,
    88. 0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,
    89. 0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,
    90. 0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,
    91. 0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,
    92. 0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,
    93. 0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,
    94. 0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,
    95. 0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,
    96. 0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,
    97. 0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,
    98. 0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,
    99. 0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,
    100. 0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,
    101. 0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,
    102. };
    103. #pragma pack()
    104. //本函数不支持调色板
    105. int write_bmp(char *name,char *buf)
    106. {
    107. int fd = 0;
    108. BITMAPFILEHEADER bit_map_file_header;
    109. BITMAPINFOHEADER bit_map_info_header;
    110. fd = open(name,O_RDWR | O_CREAT | O_TRUNC,0666);
    111. if(fd < 0){
    112. perror("open");
    113. return -1;
    114. }
    115. printf("%ld,%ld\n",sizeof(BITMAPFILEHEADER),sizeof(BITMAPINFOHEADER));
    116. printf("open %s ok\n",name);
    117. memset(&bit_map_file_header,0,sizeof(BITMAPFILEHEADER));
    118. memset(&bit_map_info_header,0,sizeof(BITMAPINFOHEADER));
    119. bit_map_file_header.bfType = 0x4D42;
    120. bit_map_file_header.bfSize = 1280*800 + 54 + 1024;
    121. bit_map_file_header.bfOffBits = 54 + 1024;//就是位图数据之前的文件头长度,包括调色板。
    122. write(fd,&bit_map_file_header,sizeof(BITMAPFILEHEADER));
    123. bit_map_info_header.biSize = 40;
    124. bit_map_info_header.biWidth = 1280;
    125. bit_map_info_header.biHeight = 800;
    126. bit_map_info_header.biPlanes = 1;
    127. bit_map_info_header.biBitCount = 8;
    128. bit_map_info_header.biCompression = 0;// //压缩方式,可以是0,1,2,其中0表示不压缩
    129. bit_map_info_header.biSizeImage = 1280*800;
    130. bit_map_info_header.biXPelsPerMeter = 0;
    131. bit_map_info_header.biYPelsPerMeter = 0;
    132. bit_map_info_header.biClrUsed = 256;
    133. bit_map_info_header.biClrImportant = 256;
    134. write(fd,&bit_map_info_header,sizeof(BITMAPINFOHEADER));
    135. write(fd,color_board,1024);
    136. write(fd,buf,1280*800);
    137. close(fd);
    138. return 0;
    139. }
    140. int main()
    141. {
    142. memset(read_buf,0x55,sizeof(read_buf));
    143. write_bmp("8_256.bmp",read_buf);
    144. return 0;
    145. }

    运行结果

    下面这个就是生成的图片的属性:

    结束

  • 相关阅读:
    C练题笔记之:Leetcode-137. 只出现一次的数字 II
    汽车电子相关术语
    【笔记篇】08仓储管理系统概况——之《实战供应链》
    常见的js手写题【总结】
    如何使用前端模块化开发?
    【无标题】
    同步协程的必备工具: WaitGroup
    Go 反射终极指南:从基础到高级全方位解析
    Java学习 --- 设计模式七大原则的依赖倒转原则
    Hive之函数
  • 原文地址:https://blog.csdn.net/yueni_zhao/article/details/127427713