windows程序设计之DIB操作

主要介绍下与设备无关的位图DIB(Device Independent Bitmap)


位图的基本格式
1.文件头
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;//bmp图类型为'BM'或者0X4D42
        DWORD   bfSize;//整个文件大小
        WORD    bfReserved1;//0
        WORD    bfReserved2;//0
        DWORD   bfOffBits;//DIB像素数据偏移
} BITMAPFILEHEADER
2.信息头
typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;//结构体大小 = 40
        LONG       biWidth;//文件宽度(像素)
        LONG       biHeight;//文件高度(像素)
        WORD       biPlanes;//1
        WORD       biBitCount;//每像素位数(1,4,8,16,24,32)
        DWORD      biCompression;//压缩方式
        DWORD      biSizeImage;//实际位图数据占用的字节数
        LONG       biXPelsPerMeter;//X方向分辨率
        LONG       biYPelsPerMeter;//Y方向分辨率
        DWORD      biClrUsed;//使用的颜色数
        DWORD      biClrImportant;//重要颜色数

} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

biBitCount字段
$ 1(2色DIB)
$ 4(16色DIB)
$ 8(256色DIB)
$ 24(全色DIB)
 
3.RGB色彩表(不一定有)
对于像素位(biBitCount字段)是1,4,和8时,BITMAPINFOHEADER后面跟着的是色彩表。
typedef struct tagRGBQUAD {
        BYTE    rgbBlue;//蓝色
        BYTE    rgbGreen;//绿色
        BYTE    rgbRed;//红色
        BYTE    rgbReserved;//保留,0
} RGBQUAD;

每个像素点都是一个RGB,三种色彩组成颜色。要注意的就是里面的元素顺序是BGR。


4.位图像素位
这里才是图像数据的真实存放处,可以在这里读取图像的数据进行操作。每个像素点都是由RGB数组构成。要注意的是,在DIB中,图像的底行是文件的第一行,图像的顶行是文件的最后一行。但是对于同一行来说,还是从左到右存放数据的。windows程序设计上是这样说的:从下到上DIB的原点是位图图像的左下角,它是图像的第一行的第一个像素。从上到下DIB的原点也是位图图像的左下角,但是这种情况下,左下角是位图数据的最后一行的第一个像素。
DIB中的行数是BITMAPINFOHEADER结构中的biHeight字段,每一行的像素是该结构中biWidth字段,每一行从左边开始,向右数,每个像素位数由bcBitCount确定。
每行的长度必须是4的倍数。
RowLength = 4 * ((bmch.bcWidth * bmch.bcBitCount + 31) / 32)计算;

总的像素位数据大小 = RowLength *bmch.biHeight计算。




posted @ 2011-10-31 23:11  Livesss  阅读(763)  评论(0编辑  收藏  举报