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)
未完待续。。。