位图和BitBlt

一、位图
1.位图概述
     位图是计算机当中用来储存真实世界图像的一种方法,位图再计算机当中以二维数组的方式储存,数组当中的每个元素对应位图当中的每个象素。与位图有关的参数有位图的长和宽,指的是在位图的水平和垂直方向上存在象素的数量;位图的色深是指位图当中的每个位或者说每个象素用多少的储存空间来表示象素的颜色,单色位图使用1位储存来表示颜色,16位位图使用16位的储存来表示位图当中象素的色彩。
2.使用位图
     位图是储存在计算机内存当中的一个GDI对象,与其他GDI对象一样,位图也有一个位图句柄来指向其在内存当中的储存空间,这个句柄的类型是HBITMAP。我们在使用位图之前需要首先创建一个位图对象,创建位图对象需要调用CreateCompatibleBitmap(HDC,int cx,int cy);函数,这个函数返回一个位图句柄,函数的参数表当中的HDC参数表示位图的色深与该HDC句柄相兼容,后面两个int型的参数表示位图的高和宽。
     同其他的GDI对象一样在位图当中操作也需要一个设备描述表句柄,获取这个句柄的方法是调用CreateCompatibleBitmapDC(HDC)函数,这个函数返回一个HDC句柄,参数当中的HDC是返回设备描述表相兼容的一个HDC。在获取位图的设备描述表句柄以后就可以象在显示器上绘图一样在位图上绘图。
     在操作位图时有时需要获得位图的大小,这是我们需要调用GetObject函数,这个函数的原型是GetObject(HBITMAP,int sizeofhbitmap,BITMAP *);最后一个参数是一个指向BITMAP的结构指针。在调用完函数以后我们可以通过这个BITMAP结构的bmWidth和bmHeight字段来获取位图的宽和高。
     同时我们能够创建一个位图的资源,我们可以使用LoadBitmap函数来载入资源文件当中的位图供程序使用。另外我们能够利用CreatePatternBrush函数来创建一个位图画刷。
二、BitBlt
     所谓的BitBlt就是将显存当中不同内存块当中的储存进行复制。BitBlt有两种方式一种是等比例的复制,另外一种是非等比例的复制。等比例的复制调用BitBlt函数这个函数的原型是BitBlt(HDC hdcDsp,int x,int y,int cx,int cy,HDC hdcSour,int x,int y,int);函数的前五个参数是目标位图的设备描述表句柄、位置和大小,紧接着的三个参数是源位图的设备描述表句柄、以及开始的位置,最后一个参数表示BitBlt的方式,一般使用SRCCOPY。
      另外一种BitBlt的方式是非等比例的复制,这时需要调用StretchBlt函数,这个函数的原型是StretchBlt(HDC hdcDsp,int x,int y,int cx,int cy,HDC hdcSour,int x,int y,int cx,int cy,int);函数参数的意义与BitBlt相似。在使用这种方式BitBlt时可能存在位图的缩放,这时也就可能存在位图当中象素行的合并和删除,要定义象素行合并的方式需要调用SetStretchBltMode(HDC,int Mode);函数,函数当中第一个参数是BitBlt当中目标位图的HDC,第二个参数表示处理象素行合并或者删除的方式,这里的可行值有WHITEONBLACK,BLACKONWHITE,COLORONCOLOR三个,前两个用于黑白位图当中,其中第一个用于黑色为背景白色为图像主要颜色的黑白图像当中,后一个正好相反;最后一个参数用在彩色图像的缩放当中。
三、位图使用实例
     可以将位图加入到菜单当中作为菜单的一个选项。将位图加入菜单的方法是首先使用GetMenu函数获得菜单的句柄,然后使用ApendMenu(hMenu,MF_BITMAP,ID,hBitmap)函数调用将位图加入到才当当中去。
     一般的位图使用获得的位图为矩形,我们使用BitBlt函数当中的光栅操作可以使位图呈现出除矩形外的其他形状。首先我们需要一个MASK位图,这个位图的大小与源位图相同,在想要显示的地方MASK位图使用白色其他位置使用黑色,然后我们将MASK位图和源位图以源位图作为目标做BitBlt操作光栅操作为SRCAND;最后我们在WM_PAINT消息绘图当中首先将MASK位图BitBlt到窗口当中,光栅参数使用0x220326,然后将修改后的源位图BitBlt到窗口中,光栅操作使用SRCPAINT。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值