我是靠谱客的博主 优雅老师,最近开发中收集的这篇文章主要介绍14、位图,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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进行销毁。

  • 位图的像素位
    使用CreateBitmapCreateBitmapIndirect可以在创建位图时,或者使用SetBitmapBits在创建位图后(GetBitmapBits可以获取位图像素位的值),指定位图像素位的值。

    通常只在单色位图中指定像素位的值。单色位图简单,可以知道指定值的实际内容,0就是黑色,1就是白色。

  • 内存设备环境
    内存设备环境只存在于内存中,并没有相应的图形输出设备,但它和特定的图形输出设备兼容。位图是一种特殊的GDI对象,它只能被选入到内存设备环境中。而且,只有单色位图,或者和设备兼容的位图才能成功选入内存设备环境。所以,CreateBitmap随意创建的位图并没有实际意义。
    使用CreateCompatibleDC可以创建设备兼容的内存设备环境:

    HDC     WINAPI CreateCompatibleDC( _In_opt_ HDC hdc);
    
  • 位图资源
    除了在代码中创建位图,还可以在资源管理界面创建位图,然后在代码中用LoadBitmap把资源加载到内存中。位图资源总是和视频显示器兼容。使用完的位图资源应该调用DeleteObject删除。

最后

以上就是优雅老师为你收集整理的14、位图的全部内容,希望文章能够帮你解决14、位图所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部