中使用了参数SRCAND(不同于先前代码中SRCCOPY,它仅仅意味着复制源位图到目的位图),它的含义为源和目的间进行AND操作。我们不知道天极网的编辑同志是怎么为文章中的图片加logo的,有可能他们就使用了具有自动AND功能的图像加logo批处理软件。的确,我们可以利用例程中的原理写一个批处理软件,一次对一堆图片自动添加logo。
参数dwRop除了可以为SRCAND和SRCCOPY外,还可以有如下取值:
BLACKNESS:输出区域为黑色
DSTINVERT:反转目的位图
MERGECOPY:用与操作把图案(Pattern)与源位图融合起来
MERGEPAINT:用或操作把反转的源位图与目的位图融合起来
NOTSRCCOPY:把源位图反转然后拷贝到目的地
NOTSRCERASE:用或操作融合源和目的位图,然后再反转
PATCOPY:把图案拷贝到目的位图中
PATINVERT:用异或操作把图案与目的位图相融合
PATPAINT:用或操作融合图案和反转的源位图,然后用或操作把结果与目的位图融合
SRCERASE:先反转目的位图,再用与操作将其与源位图融合
SRCINVERT:用异或操作融合源位图和目的位图
SRCPAINT:用或操作融合源位图和目的位图
WHITENESS:输出区域为白色
合理利用这些取值将帮助我们制作出特定要求的图像处理软件。
从上述实例我们可以看出,在VC中使用CBitmap类,必须将位图放入工程的资源中,并使用类 CBitmap的成员函数LoadBitmap加载之,再通过CDC类的成员函数BitBlt进行DC拷贝等操作达到显示的目的。CBitmap有显示的不足:
(1) 位图需要放入工程资源中,这将导致工程的可执行文件变大;
(2) 因为位图需放入工程资源中,而资源中不能无穷无尽地包含位图,程序无法自适应地选取其它位图,能使用的位图十分有限的;
(3) 类CBitmap只是DDB位图操作API的封装,不能独立于。
DIB位图则可以解决上述问题,其特点是以.BMP位图文件格式存储独立于平台的图像数据,下面我们来详细。
4. DIB位图编程
4.1位图文件格式
先来分析DIB位图文件的格式。位图文件分为四部分:
(1)位图文件头BITMAPFILEHEADER
位图文件头BITMAPFILEHEADER是一个结构体,长度为14字节,定义为:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //文件类型,必须是0x424D,即字符串"BM"
DWORD bfSize; //文件大小,包括BITMAPFILEHEADER的14个字节
WORD bfReserved1; //保留字
WORD bfReserved2; //保留字
DWORD bfOffBits; //从文件头到实际的位图数据的偏移字节数
} BITMAPFILEHEADER;
(2)位图信息头BITMAPINFOHEADER
位图信息头BITMAPINFOHEADER也是一个结构体,长度为40字节,定义为:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //本结构的长度,为40
LONG biWidth; //图象的宽度,单位是象素
LONG biHeight; //图象的高度,单位是象素
WORD biPlanes; //必须是1
WORD biBitCount;
//表示颜色时要用到的位数,1(单色), 4(16色), 8(256色), 24(真彩色)
DWORD biCompression;
//指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS等,BI_RGB表示不压缩
DWORD biSizeImage;
//实际的位图数据占用的字节数,即 biSizeImage=biWidth’ × biHeight,biWidth’是biWidth 按照4的整倍数调整后的结果
LONG biXPelsPerMeter; //目标设备的分辨率,单位是每米的象素个数
LONG biYPelsPerMeter; //目标设备的垂直分辨率,单位是每米的象素个数
DWORD biClrUsed; //位图实际用到的颜色数,0表示颜色数为2biBitCount
DWORD biClrImportant; //位图中重要的颜色数,0表示所有颜色都重要
} BITMAPINFOHEADER;
(3)调色板Palette
调色板Palette针对的是需要调色板的位图,即单色、16色和256色位图。对于不以调色板方式存储的位图,则无此项信息。调色板是一个数组,共有biClrUsed个元素(如果该值为0,则有2biBitCount个元素)。数组中每个元素是一个RGBQUAD结构体,长度为4个字节,定义为:
typedef struct tagRGBQUAD
{
BYTE rgbBlue; //蓝色分量
BYTE rgbGreen; //分量
BYTE rgbRed; //红色分量
BYTE rgbReserved; //保留值
} RGBQUAD;