第十章:位图

来源:互联网 发布:假如不抗美援朝 知乎 编辑:程序博客网 时间:2024/05/23 12:56
 

1. Windows的位图实际上就是一些和显示像素相对应的位阵列.

2. GDI位图和设备无关的位图是两种不同的Windows位图.GDI位图是由Microsoft基本类库中的CBitmap类表示的.CBitmap的对象中,包含了一种和WindowsGDI模块有关的Windows数据结构,该数据结构是与设备相关的.

Win32,可以把一个GDI位图句柄放到剪贴板上,传出到另一个进程中.但在这种现象的背后,Windows实际上是把设备相关位图转化为一个DIB,并把DIB拷贝到内存中.

3. 任何Windows及其都可以处理DIB,他通常以后缀为.BMP的文件形式被保存在磁盘中后者作为资源存在于程序的EXE或者DLL

我们不能直接把位图选进显示设备环境或者打印机设备环境中,而应按如下步骤来使用:

①   首先利用CDC∷CreateCompatibleDC函数,为位图创建一个特殊的内存设备环境.

② 然后利用StretchBlt或者BitBlt成员函数,将内存设备环境中的各个位复制到真正的设备环境中去

③ 以上这些操作通常是应该在视图的OnDraw函数中被调用的.

其中:BitBlt函数将Red Blocks的像素从内存显示环境赋值到显示器(或打印机)设备环境中.

函数:

CDCSetStretchBltMode

int  SetStretchBltMode(int nStretchMode);

返回值:拓展模式的前一次取值. 可以是STRETCH_ANDSCANS,STRETCH_DELETESCANSSTRETCH_ORSCANS

参数
nStretchMode指定扩展模式。可为下列值之一: 

值 

描述 

BLACKONWHITE 

使用颜色值对已被排除和当前存在的像素进行布尔“与”操作。如果是黑白位图,模式保留黑色像素 

COLORONCOLOR 

删除像素。模式删除所有像素,不保留它们的信息 

HALFTONE 

将源矩形的像素映射到目标矩形的像素组中。目标像素组的颜色与源像素接近设置了HALFTONE后,应用必须调用Win 32函数::SetBrushOrgEx来设置画刷的初始位置,否则会出现画刷对齐错误 

STRETCH_ANDSCANS 

Windows 95使用,同BLACKONWHITE 

STRETCH_DELETESCANS 

Windows 95使用,同COLORONCOLOR 

STRETCH_HALFTONE 

Windows 95使用,同HALFTONE 

STRETCH_ORSCANS 

Windows 95使用,同WHITEONBLACK 

WHITEONBLACK 

使用颜色值对已被排除和当前存在的像素进行布尔与操作。如果是黑白位图,模式保留白色像素 

说明:StretchBlt成员函数设置位图拓展模式.模式定义了利用该函数压缩的信息是如何从位图中清楚的. 模式定义了利用该函数压缩的信息是如何从位图中清除的。BLACKONWHITE(STRETCH_ANDSCANS) WHITEONBLACK(STRETCH_ ORSCANS)模式一般用来在黑白位图中保存前景像素。COLORONCOLOR (STRETCH_DELETESCANS)模式用于保存彩色位图中的颜色。HALFTONE模式比其它模式需要对源图象作更多的处理,速度比其它模式慢,但质量更高。还要注意,HALFTONE必须在设置了SetBrushOrgEx之后调用,以避免画刷对齐错误。还可获得其它的扩展模式,取决于设备驱动程序的能力。


CDCSelectClipRgn

virtual int SelectClipRgn(CRgn* pRgn)

int SelectClipRgn(CRgn* pRgn,int nMode)

返回值:区域类型,可以的取值如下:

● COMPLEXREGION 剪切区有覆盖的边界

● ERROR 设备上下文无效

● NULLREGION 新剪切区为空

● SIMPLEREGION 剪切区无覆盖边界

参数:

pRgn:表明被选择的区域

● 在函数的第一个版本中,如果该值为NULL,整个客户区被选中,输出仍剪切到窗口

● 在函数的第二个版本中,只有指定了RGN_COPY,该句柄才能为NULL

nMode:指定要进行的操作,可以为下列值之一:

· 

RGN_AND 

新剪切区包含与当前剪切区的覆盖部分,区域由pRgn标识。 

· 

RGN_COPY 

新剪切区是pRgn标识区域的拷贝,这与SelectClipRgn的第一种版本相同。如果pRgn标识的区域为NULL,则新剪切区成为缺省的剪切区(空区域)。 

· 

RGN_DIFF 

新剪切区包括当前剪切区和被pRgn标识区域所排除的区域。 

· 

RGN_OR 

新剪切区包括当前剪切区和pRgn标识区域。 

· 

RGN_XOR 

新剪切区包括当前剪切区和pRgn标识区域,但不包括覆盖区域。 


说明:
为设备上下文选择区域作为当前剪切区。只利用了选定区域的拷贝,函数本身可被其它设备上下文选用,或者被删除。函数假设给定区域的坐标都使用设备坐标。某些打印机为保持文本的精确度,支持用比图形输出更高的分辨率进行文本输出。这些设备在更高的分辨率下报告设备单位,即使用文本单位。然后为图形缩放坐标以便使几个设备单位与1图形单位对应。可以调用使用文本单位的SelectClipRgn函数。在GDI中必须使用图形缩放的应用,可以使用GETSCALINGFACTOR打印程序脱离来决定缩放因子。缩放因子影响剪切。如果某区域用于剪切图形,GDI用缩放因子来分解坐标。如果用于剪切文字,GDI不作缩放调整,缩放因子为1,坐标将被2除;缩放因子为2,坐标将被4除,依此类推。

CDC::IntersectClipRect

virtual int IntersectClipRect(int x1,int y1 ,int x2,int y2);
virtual int IntersectClipRect(LPRECT lpRect)

返回值:新剪切区类型,可为下列值的任一种: 

· 

COMPLEXREGION 

新剪切区有覆盖的边界。 

· 

ERROR 

设备上下文无效。 

· 

NULLREGION 

新剪切区为空。 

· 

SIMPLEREGION 

新剪切区无覆盖边界。 


参数: 

x1 

指定矩形左上角的X逻辑坐标。 

y1 

指定矩形左上角的Y逻辑坐标。 

x2 

指定矩形右下角的X逻辑坐标。 

y2 

指定矩形右下角的Y逻辑坐标。 

lpRect 

指定矩形。可以为该参数传递RECT结构或CRect对象 。 

说明:

通过当前区域和用x1,y1,x2,y2指定的矩形截取形成的新的剪切区.GDI剪切所有随后输出,使其适合新的边界,宽度和高度不得超过3267

总结:上面的两个函数:SelectClipRgnIntersectClipRect两个函数主要是为了达到SetClipRect的功能

CDC::PatBlt
BOOL PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop);
返回值:如果成功,则返回非零值,否则为0。
参数: 

即将接收模式的矩形的左上角的X逻辑坐标。 

即将接收模式的矩形的左上角的Y逻辑坐标。 

nWidth 

即将接收模式的矩形的宽度(逻辑单位)。 

nHeight 

即将接收模式的矩形的高度(逻辑单位)。 

dwRop 

指定光栅操作代码。光栅操作代码描述了GDI是怎样将涉及当前画刷、可能存在的源位图、目标位图的输出操作与颜色组合在一起,参数可以取以下值: 

· 

PATCOPY 

拷贝模式至目标位图。 

· 

PATINVERT 

使用布尔XOR运算符组合模式与目标位图。 

· 

DSTINVERT 

反转目标位图。 

· 

BLACKNESS 

使所有输出变黑。 

· 

WHITENESS 

使所有输出变白。 


说明:
在设备上创建模式。将设备已有的模式与选择的画刷组合。dwRop 指定的光栅操作代码说明了模式是怎样组合的。本函数列出的光栅操作只是全部256种光栅操作代码的子集。带有源对象的光栅操作代码并不被使用。不是所有的设备上下文支持PatBlt函数。可调用带RASTERCAPS索引的GetDeviceCaps成员函数决定设备上下文是否支持PatBlt,并检验RC_BITBLT标记的返回值。

4. 判断一个程序实现了自己的调色板的具体步骤:

● 只要一个程序实现了调色板.Windows消息WM_PALETTECHANGED就会被发送到我们的程序主窗口.

● 只要我们的程序中的某个窗口获得了输入焦点,那么WM_QUERYNEWPALETTE也会被发送到我们的程序.对于这两个消息,我们的程序都应该实现调色板.

但是这些调色板消息不会发送到视图窗口.我们必须在应用程序的主框架窗口里映射这些消息然后通知视图

5. BMP文件中DIB的结构:

BITMAPFILEHEADER

(只用于BMP文件)

bType = “BM”

bOffBits

BITMAPINFOHEADER

biSize(本结构的大小)

biWidth(按像素计算)

biHeight(同理)

biPlanes = 1

biBitCount(1,4,8,16,24,32)

biCompression(0表示不压缩)

biSizeImage(只在压缩图中使用)

biClrUsed(颜色表不足时非零)

颜色表

单色DIB2个表项

4-bpp DIB16个表项或者更少

8-bpp DIB 256个表项或更少

每个表项为32

DIB位图

像素按每行每列的顺序排列

每行扩展到4字节边界

BITMAPFILEHEADER结构包含位图的位数,每像素的位数,4-bpp8-bpp位图的压缩信息和颜色表入口数目.如果DIB被压缩了,那么头结构还包含了像素阵列的大小,否则我们可以从位图维数和每像素的位数计算出像素阵列的大小.头结构下面紧接着的是颜色表(如果DIB有颜色表的话),然后DIB图像跟在后面.DIB图像包含像素按照行排列,每一行又按列排列,从最下面的行开始排列,每行被扩展到4字节边界.
一些重要的Win32函数介绍:
SetDIBitsToDevice----该函数直接在显示器或者打印机上显示DIB.显示时不进行缩放,位图的每一位对应一个显示像素或者一个打印点.不能进行缩放限制了他的使用,该函数不能像BitBlt那样使用,因为BitBlt使用的是逻辑坐标

StretchDIBlt----该函数按照与StretchBlt类似的方法将DIB直接显示在显示器或打印机上.

GetDIBits---该函数利用申请到的内存,GDI位图来构造DIB.

CreateDIBitmap---该函数从DIB出发来创建GDI位图.

CreateDIBSection—该函数是一个新的Win32函数,他创建一个特殊的DIB,称为DIB,然后返回一个GDI位图句柄.

LoadResource
功能:该函数加载一个指定资源进全局内存

HGLOBAL LoadResource(
   HMODULE hModule;//module handle

   HRSRC    hResInfo; //Resource handle

);

参数:

hModule:[in]包含资源的执行文件的模块句柄.如果hModule为空,则系统加载当前创建的进程模块资源.

hResInfo:[in]被加载资源的句柄.这个句柄可以通过FindResource或者FindResourceEx函数来获取.

返回值:如果成功,则返回和资源相关的数据,否则返回NULL,如果想要获取更多错误信息,请调用GetLastError函数

备注:该函数返回一个向后兼容的HGLOBAL,但是他并不是返回一个全局内存块.不能通过GlobalLockGlobalFree函数来访问这个句柄