Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103554434
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-05-19 21:16:33

来源:

中使用了参数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;

阅读(505) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~