[开发工具] 图片.bmp数据结构

[复制链接]
862|3
 楼主| OKAKAKO 发表于 2024-8-30 08:22 | 显示全部楼层 |阅读模式
BMP(Bitmap)文件格式是一种简单的位图图像格式,其数据结构分为几个主要部分:文件头、信息头、调色板(可选)和像素数据。下面是各部分的详细说明。

1、文件头(File Header)

bfType (2 bytes): 文件类型,通常为'BM'(0x42 0x4D)。
bfSize (4 bytes): 文件大小(以字节为单位)。
bfReserved1 (2 bytes): 保留字,通常为0。
bfReserved2 (2 bytes): 保留字,通常为0。
bfOffBits (4 bytes): 从文件头到像素数据的偏移量。
2、信息头(DIB Header)

biSize (4 bytes): 信息头的大小(通常为40)。
biWidth (4 bytes): 图像宽度(以像素为单位)。
biHeight (4 bytes): 图像高度(以像素为单位)。
biPlanes (2 bytes): 色平面数,通常为1。
biBitCount (2 bytes): 每个像素的位数(如24位、32位)。
biCompression (4 bytes): 压缩类型(0为不压缩)。
biSizeImage (4 bytes): 图像数据的大小(可以为0)。
biXPelsPerMeter (4 bytes): 水平分辨率(像素每米)。
biYPelsPerMeter (4 bytes): 垂直分辨率(像素每米)。
biClrUsed (4 bytes): 使用的颜色数(0表示使用所有颜色)。
biClrImportant (4 bytes): 重要的颜色数(0表示所有)。
3、调色板(Color Palette)
对于某些格式(如1位或4位色),可能会包含调色板。调色板由颜色索引组成,使用RGB格式(每个颜色占用4个字节,包含蓝、绿、红、保留字节)。

4、像素数据(Pixel Data)
像素数据从bfOffBits指定的位置开始。像素的排列顺序通常是自下而上,从左到右,具体存储格式取决于biBitCount:

24位BMP:每个像素使用3个字节,分别表示蓝色、绿色和红色(BGR格式)。
32位BMP:每个像素使用4个字节(蓝、绿、红、透明度)。

 楼主| OKAKAKO 发表于 2024-8-30 08:22 | 显示全部楼层
在C语言中,BMP文件格式有一个特定的数据结构。BMP文件分为文件头、信息头和像素数据。下面是BMP文件的基本数据结构:

BMP 文件数据结构

  1. #include <stdint.h>

  2. // BMP 文件头
  3. typedef struct {
  4.     uint16_t bfType;      // 文件类型,通常为 'BM'
  5.     uint32_t bfSize;      // 文件大小
  6.     uint16_t bfReserved1; // 保留字段
  7.     uint16_t bfReserved2; // 保留字段
  8.     uint32_t bfOffBits;   // 像素数据的偏移量
  9. } BMPFileHeader;
  10. // BMP 信息头

  11. typedef struct {
  12.     uint32_t biSize;          // 信息头大小
  13.     int32_t biWidth;          // 图像宽度
  14.     int32_t biHeight;         // 图像高度
  15.     uint16_t biPlanes;        // 色平面数,通常为1
  16.     uint16_t biBitCount;      // 每个像素的比特数(如24位)
  17.     uint32_t biCompression;   // 压缩类型
  18.     uint32_t biSizeImage;     // 图像大小
  19.     int32_t biXPelsPerMeter;   // 水平分辨率
  20.     int32_t biYPelsPerMeter;   // 垂直分辨率
  21.     uint32_t biClrUsed;       // 使用的颜色数
  22.     uint32_t biClrImportant;   // 重要的颜色数
  23. } BMPInfoHeader;
  24. // 像素数据

  25. typedef struct {
  26.     uint8_t blue;    // 蓝色分量
  27.     uint8_t green;   // 绿色分量
  28.     uint8_t red;     // 红色分量
  29. } RGBPix

sfd123 发表于 2024-8-30 13:14 | 显示全部楼层
这个玩意 我以前 还真的  搞过,做了个产品,为了做说明书,需要指导在液晶上的操作,拍照的方式太丑了,就采用读取液晶内存数据,然后存成图片的方式,非常棒!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

260

主题

2096

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部