概述
1、位图 |
---|
位图是点阵图形,由像素组成。位图的大小由图像尺寸和颜色深度决定。图像尺寸决定了像素的数量,颜色深度决定了每个像素的位数(bits)。
2、位块传输 |
---|
位块传输是指,把源设备环境中的一个区域复制到目标设备环境中。实际不是简单的复制,是源位图、目标位图和目标设备环境的背景画刷三者进行一种三元光栅操作的结果。windows定义了10多种三元光栅操作:
/* Ternary raster operations */
#define SRCCOPY (DWORD)0x00CC0020 /* dest = source */
#define SRCPAINT (DWORD)0x00EE0086 /* dest = source OR dest */
#define SRCAND (DWORD)0x008800C6 /* dest = source AND dest */
#define SRCINVERT (DWORD)0x00660046 /* dest = source XOR dest */
#define SRCERASE (DWORD)0x00440328 /* dest = source AND (NOT dest ) */
#define NOTSRCCOPY (DWORD)0x00330008 /* dest = (NOT source) */
#define NOTSRCERASE (DWORD)0x001100A6 /* dest = (NOT src) AND (NOT dest) */
#define MERGECOPY (DWORD)0x00C000CA /* dest = (source AND pattern) */
#define MERGEPAINT (DWORD)0x00BB0226 /* dest = (NOT source) OR dest */
#define PATCOPY (DWORD)0x00F00021 /* dest = pattern */
#define PATPAINT (DWORD)0x00FB0A09 /* dest = DPSnoo */
#define PATINVERT (DWORD)0x005A0049 /* dest = pattern XOR dest */
#define DSTINVERT (DWORD)0x00550009 /* dest = (NOT dest) */
#define BLACKNESS (DWORD)0x00000042 /* dest = BLACK */
#define WHITENESS (DWORD)0x00FF0062 /* dest = WHITE */
#if(WINVER >= 0x0500)
#define NOMIRRORBITMAP (DWORD)0x80000000 /* Do not Mirror the bitmap in this call */
#define CAPTUREBLT (DWORD)0x40000000 /* Include layered windows */
#endif /* WINVER >= 0x0500 */
BOOL WINAPI BitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop);
BitBlt
函数把源设备环境中的一个矩形区域传输到目标设备环境中一个大小一样的矩形区域中,rop
参数指定了光栅操作。
BOOL WINAPI StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop);
StretchBlt
可以分别指定源矩形区域大小和目标矩形区域大小,在传输过程中可以对位图进行拉伸。
使用StretchBlt
缩小位图时,需要对一些像素行列进行合并,合并策略取决于设备环境当前的拉伸模式。windows定义了几种拉伸模式,SetStretchBltMode
可以修改设备环境的拉伸模式。
/* StretchBlt() Modes */
#define BLACKONWHITE 1
#define WHITEONBLACK 2
#define COLORONCOLOR 3
#define HALFTONE 4
#define MAXSTRETCHBLTMODE 4
#if(WINVER >= 0x0400)
/* New StretchBlt() Modes */
#define STRETCH_ANDSCANS BLACKONWHITE
#define STRETCH_ORSCANS WHITEONBLACK
#define STRETCH_DELETESCANS COLORONCOLOR
#define STRETCH_HALFTONE HALFTONE
#endif /* WINVER >= 0x0400 */
BOOL WINAPI PatBlt(HDC hdc, int x, int y, int w, int h, DWORD rop);
PatBlt
函数实际效果就是用画刷进行背景填充,但填充过程需要在画刷和目标位图之间进行光 栅操作。
3、GDI位图对象 |
---|
·前面提到几种GDI
对象,位图也是一种GDI
对象。
-
创建位图
HBITMAP WINAPI CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitCount, CONST VOID *lpBits);
使用
CreateBitmap
可以创建任意格式的位图。通常只有 单色位图 和设备环境兼容的位图才有实际意义。而创建设备环境兼容的位图更方便的应该使用CreateCompatibleBitmap
。HBITMAP WINAPI CreateCompatibleBitmap(HDC hdc, int cx, int cy);
最后一种方法是通过一个
BITMAP
结构体创建:HBITMAP WINAPI CreateBitmapIndirect( _In_ CONST BITMAP *pbm); // 使用CreateBitmapIndirect时,不需要设置bmWidthBytes字段,windows会计算出来 typedef struct tagBITMAP { LONG bmType; // 设0 LONG bmWidth; LONG bmHeight; LONG bmWidthBytes; WORD bmPlanes; WORD bmBitsPixel; LPVOID bmBits; } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
使用
GetObject
可以从一个位图句柄HBITMAP
中获取相关信息,填充到BITMAP
结构体中。使用完的位图应该调用
DeleteObject
进行销毁。 -
位图的像素位
使用CreateBitmap
、CreateBitmapIndirect
可以在创建位图时,或者使用SetBitmapBits
在创建位图后(GetBitmapBits
可以获取位图像素位的值),指定位图像素位的值。通常只在单色位图中指定像素位的值。单色位图简单,可以知道指定值的实际内容,0就是黑色,1就是白色。
-
内存设备环境
内存设备环境只存在于内存中,并没有相应的图形输出设备,但它和特定的图形输出设备兼容。位图是一种特殊的GDI
对象,它只能被选入到内存设备环境中。而且,只有单色位图,或者和设备兼容的位图才能成功选入内存设备环境。所以,CreateBitmap
随意创建的位图并没有实际意义。
使用CreateCompatibleDC
可以创建设备兼容的内存设备环境:HDC WINAPI CreateCompatibleDC( _In_opt_ HDC hdc);
-
位图资源
除了在代码中创建位图,还可以在资源管理界面创建位图,然后在代码中用LoadBitmap
把资源加载到内存中。位图资源总是和视频显示器兼容。使用完的位图资源应该调用DeleteObject
删除。
最后
以上就是优雅老师为你收集整理的14、位图的全部内容,希望文章能够帮你解决14、位图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复