之前MATLAB部分遇到一个问题,我在Hough变换完成之后得到的图像需要进一步的处理,但是我是通过在之前的图像上用循环遍历添加上点,这样的到的图片使用句柄保存只能得到循环运算之前的原图,暂时没有找到解决方法,就先开始准别C语言的读取BMP文件的方法
C语言读取BMP文件
以下为按照BMP格式相搭配的读取头文件
/* 位图文件头 (位图头的字节数 = 位图文件字节数 - 位图图像数据字节数)*/
偏移量 | 域名称 | 大小 | 内容 |
---|---|---|---|
0000H | 文件标识 | 2 | 识别位图的类型 |
0002H | File Size | 4 | 表示文件的大小,单位是B |
0006H | Reserved | 4 | 保留信息,用处目前不明只知道必须为0 |
000AH | Bitmao Data Offset | 4 | 从文件开始到位图数据之间的偏移量 |
typedef struct BMP_FILE_HEADER
{
WORD bType; // 文件标识符
DWORD bSize; // 文件的大小
WORD bReserved1; // 保留值,必须设置为0
WORD bReserved2; // 保留值,必须设置为0
DWORD bOffset; // 文件头的最后到图像数据位开始的偏移量
} BMPFILEHEADER; // 14 字节
/* 位图信息头 */
偏移量 | 域名称 | 大小 | 内容 |
---|---|---|---|
000EH | Bitmap Header Size | 4 | 位图的信息头的长度,一般是28H |
0012H | Width | 4 | 位图的宽度,单位是像素 |
0016H | Height | 4 | 位图的高度,单位是像素 |
001AH | Planes | 4 | 位图的位面数,肯定是1 |
001CH | Bit per pixel | 2 | 每个像素的位数,1\4\8\16\24\32,分别表示2的N次方的色位,单色图像默认为1,即只有黑白 |
001EH | Comression | 4 | 压缩说明,0:不压缩;1:使用8位RLE压缩方式;2:使用4位RLE压缩方式;3:Bitfields-位域存放方式 |
0022H | Bitmap Data SIze | 4 | 用字节数字表示的位图数据的大小,必须是4的倍数 |
0026H | HResolution | 4 | 用像素表示水平分辨率 |
002AH | VResolution | 4 | 用像素表示垂直分辨率 |
002EH | Colors | 4 | 位图使用的颜色数 |
0032H | Important Colors | 4 | 指定的重要的颜色数,当数值等于Colors的数值的时候表示所有颜色一样重要 |
typedef struct BMP_INFO
{
DWORD bInfoSize; // 信息头的大小
DWORD bWidth; // 图像的宽度
DWORD bHeight; // 图像的高度
WORD bPlanes; // 图像的位面数
WORD bBitCount; // 每个像素的位数
DWORD bCompression; // 压缩类型
DWORD bmpImageSize; // 图像的大小,以字节为单位
DWORD bXPelsPerMeter; // 水平分辨率
DWORD bYPelsPerMeter; // 垂直分辨率
DWORD bClrUsed; // 使用的色彩数
DWORD bClrImportant; // 重要的颜色数
} BMPINF; // 40 字节
/* 彩色表:调色板 */
偏移量 | 域名称 | 大小 | 内容 |
---|---|---|---|
____H | Palette | N*4 | 调色板规范,四个字节分别用来描述蓝色、绿色、红色和填充符的数值,在彩色图像的处理中就是各个通道的作用 |
typedef struct RGB_QUAD
{
WORD rgbBlue; // 蓝色强度
WORD rgbGreen; // 绿色强度
WORD rgbRed; // 红色强度
WORD rgbReversed; // 保留值
}
之后就是图像信息数据:
偏移量 | 域名称 | 大小 | 内容 |
---|---|---|---|
____H | Bitmap Data | – | 包含扫描的信息,扫描顺序是从右向左,从上到下 |