摘要:探讨了VC++6.0环境下BMP图像文件的显示。首先详细介绍BMP图像文件的两种类型DDB和DIB的各部分组成及其意义,并对DIB的两种形式Windows DIB和OS/2 DIB加以区别,然后利用VC++6.0的MFC库函数对DDB位图的显示加以实现,对DIB位图的显示过程以程序流程图的形式详细说明。
论文关键词:BMP图像,VC++6.0,图像显示,DDB位图,DIB位图
位图分为设备相关位图(DDB)和设备无关位图(DIB)两种。
1 DDB位图
DDB是一种内部位图格式,自身没有调色板,它的显示依赖于计算机显示系统内部的调色板,因此它的显示效果因计算机显示系统的不同而不同。
1.1 BITMAP结构
BITMAP结构定义了DDB位图的类型、宽度、颜色格式和像素位值信息,该结构的定义如下:
typedef struct tagBITMAP
{
int bmType; //指定位图的类型,这个值必须为0
int bmWidth; //指定位图的宽度,以像素为单位
int bmHeight; //指定位图的高度,以像素为单位
int bmWidthBytes; //指定位图中每个扫描行的字节数
BYTE bmPlanes; //指定颜色层数
BYTE bmBitsPixel; //指定每个像素所占的位数
viod FAR* bmBits; //存放像素值的内存块的地址
} BITMAP,*PBITMAP
1.2 DDB位图的显示
显示DDB位图的基本过程为:首先创建一个位图对象,并将该位图对象装入内存;然后创建一个与显示设备上下文相兼容的内存设备上下文(CDC);再将该位图对象选入创建的内存设备上下文,并保存内存设备上下文中原有位图的指针;接着显示位图;最后恢复设备上下文中原有的位图。函数DisplayDDB展示了DDB位图的显示过程。
BOOL DisplayDDB(CDC* pDC,LPCSTR lpszBitmap)
{
CBitmap Bitmap,*poldBitmap;
BITMAP bmp;
CDC dcMemory;
if(!Bitmap.LoadBitmap(lpszBitmap)) //加载位图
{ return FALSE;}
if(!dcMemory.CreateCompatibleDC(pDC)) //创建CDC
return FALSE;//创建CDC失败
//把创建的位图选入CDC
poldBitmap=(CBitmap*)dcMemory.SelectObject(&Bitmap);
//显示位图
pDC->BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcMemory,0,0,SRCCOPY);
//把原始位图选入CDC
dcMemory.SelectObject(poldBitmap);
return TRUE;
}
2 DIB位图
DIB位图是设备无关位图,它自带调色板信息,经常存储为以BMP为后缀的图像。DIB分为Windows DIB和OS/2 DIB两种。
2.1 Windows DIB
Windows DIB由BITMAPFILEHEADER(位图文件头)、BITMAPINFOHEADER(位图信息头)、RGBQUAD(位图颜色表)和位图图像数据四部分组成。
位图文件头BITMAPFILEHEADER的定义如下:
typedef struct tagMAPFILEHEADER
{
WORD bfType; 指定文件的类型,必须是BM
DWORD bfSize; 指定位图文件的大小,以字节为单位
WORD bfReserved1; 保留位,必须为0
WORD bfReserved2; 保留位,必须为0
DWORD bfOffBits; 从BITMAPFILEHEADER结构到位图数据的偏移量(字节)
} BITMAPFILEHEADER,FAR *LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;
位图信息头BITMAPFILEHEADER结构的定义如下:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //指定这个结构的大小,以字节为单位
LONG biWidthbiWidth; //指定位图的宽度,以像素为单位
LONG biHeight; //指定位图的高度,以像素为单位
WORD biPlanes; //该值必须为1
WORD biBitCount; //指定每个像素所占的位数
DWORD biCompression; //指定位图的压缩类型
DWORD biSizeImage; //指定位图数据占用的字节数,biSizeImage=biWidth’×biHeight,其中biWidth’必须是4的整数倍,biWidth’的计算方法为:((biWidth)+31)/32*4
LONG biXPelsPerMeter; //指定位图目标设备的水平分辨率(像素/米)
LONG biYPelsPerMeter; //指定位图目标设备的垂直分辨率(像素/米)
DWORD biClrUsed; //指定显示位图所用到的颜色数目,如果这个值为0,需要所有的颜色。
DWORD biClrImportant; //指定显示位图所用到的颜色数目,如果这个值为0,需要所有的颜色。
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
有的位图显示需要调色板,有的不需要。不需要调色板的位图的BITMAPINFOHEADER后直接是位图的数据。调色板是一个由biClrUsed个元素组成的数组(如果biClrUsed=0,则有2的biBitCount次幂个元素)。数组中每个元素都是一个RGBQUAD结构,RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD
{
BYTE rgbBlue; //指定该颜色的蓝色分量
BYTE rgbGreen; //指定该颜色的绿色分量
BYTE rgbRed; //指定该颜色的红色分量
BYTE rgbReserved; //保留值,必须为0
} RGBQUAD;
位图信息头和调色板组成了位图信息(BITMAPINFO)结构,BITMAPINFO结构的定义如下:
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
1/2 1 2 下一页 尾页 |