BMP 图像处理
本篇博客记录完成《数字媒体内容综合设计与实验》的图像处理实验的学习过程。要求实现一个显示 bmp 文件的程序(语言不限),并实现图像亮度、对比度调整,图像平移、放大、旋转和镜像。
参考:
BMP 文件格式
1. 位图文件头 (bmp file header) - 14 字节
字段 | 字节数 | 说明 |
---|---|---|
bfType |
2 | 文件类型 BMP 文件这两个字节为 0x4d42,对应字符’BM’ |
bfSize |
4 | 文件大小 |
bfReserved1 |
2 | 保留字段,必须设为 0 |
bfReserved2 |
2 | 保留字段,必须设为 0 |
bfOffBits |
4 | 从文件头到位图数据的偏移量,即: 偏移量 = 文件头 + 信息头 + 调色板长度 |
用 UltraEdit 打开图片 001.bmp(24 位真彩色 bmp 图):
注意读取字节反向
字段 | 值 | 说明 |
---|---|---|
bfType |
0x4D42 | BM |
bfSize |
0x0017057A = 1508730 字节 = 1.43MB | 等同于右键图片属性中显示的大小 |
bfOffBits |
0x00000036 = 54 字节 | = 文件头 14 + 信息头 40 + 调色板 0 |
2. 位图信息头 (bitmap information) - 40 字节
字段 | 字节数 | 说明 |
---|---|---|
biSize |
4 | 信息头的大小 BMP 文件为 0x28,即 40 字节 |
biWidth |
4 | 图像的宽,单位是像素 |
biHeight |
4 | 图像的高,单位是像素 |
biPlanes |
2 | 颜色平面数,总设为 1 |
biBitCount |
2 | 每像素比特数,= 比特数 / 像素数 即每个像素用多少位表示 |
biCompression |
4 | 图像的压缩类型 最常用的是 0,即 BI_RGB 格式,表示不压缩 |
biSizeImage |
4 | 位图数据的大小 图像大小 = 文件大小 bfSize - 偏移量 bfOffBits BI_RGB 格式时,可设置为 0 |
biXPelsPerMeter |
4 | 水平分辨率,单位是像素 / 米,有符号整数 |
biYPelsPerMeter |
4 | 垂直分辨率,单位是像素 / 米,有符号整数 |
biClrUsed |
4 | 位图使用的调色板中的颜色索引数 0 表示使用所有的调色板选项 |
biClrImportant |
4 | 对图像显示有重要影响的颜色索引数目 0 表示所有都重要 |
字段 | 值 | 说明 |
---|---|---|
biSize |
0x00000028 = 40 字节 | BMP 文件信息头大小 |
biWidth |
0x000002A6 = 678 像素 | 图片宽 678 像素 |
biHeight |
0x000002E5 = 741 像素 | 图片高 741 像素 |
biBitCount |
0x0018 = 24 位 | 24 位真彩色图片 |
biCompression |
0x00000000 | 不压缩 |
biSizeImage |
0x00170544 = 1508676 字节 | =bfOffbits-54 |
理论上,biSizeImage = biWidth*biHeight*biBitCount/8,由于 Windows 行扫描的最小单位为 4 字节,所以此处 biWidth 应向上取 4 的倍数。
但是从上面这张图来看,biSizeImage = 1508686 字节,确实等于 bfOffbits-54,但是不等于 680*741*24/8 =1511640 字节,也不等于 678*741*24/8 =1507194 字节,不解???
3. 调色板 (color palette) - 可选项
详见 https://blog.csdn.net/lanbing510/article/details/8176231
采用 24 位真彩色位图,无需使用调色板模块。用 3 个字节(24 位)的实际 RGB 值表示一个像素。
同理,32 位真彩色位图也不需要调色板模块。用 4 个字节(32 位)的 RGBA 值表示一个像素。
4. 位图数据 (bitmap data)
未完待续。。。
Gitalk 加载中 ...