• bitmap的mask操作


    在进行图像的处理的时候,有时候需要进行图像的mask操作。

    以下是在windows程序设计第五版里面抄下来的。

     1 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     2 {
     3     static HBITMAP hBitmapImag, hBitmapMask;
     4     static HINSTANCE hInstance;
     5     static int cxClient, cyClient, cxBitmap, cyBitmap;
     6     BITMAP bitmap;
     7     HDC hdc, hdcMemImag, hdcMemMask;
     8     int x, y;
     9     PAINTSTRUCT ps;
    10 
    11     switch(message)
    12     {
    13     case WM_CREATE:
    14         hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
    15         // loadimg and get it's size
    16         hBitmapImag = LoadBitmap(hInstance, TEXT("MATTHEW"));
    17         GetObject(hBitmapImag, sizeof(bitmap), &bitmap);
    18         cxBitmap = bitmap.bmWidth;
    19         cyBitmap = bitmap.bmHeight;
    20         // select the original image into a memory dc
    21         hdcMemImag = CreateCompatibleDC(NULL);
    22         SelectObject(hdcMemImag, hBitmapImag);
    23         //create the monochrome mask bitmap and memory dc
    24         hBitmapMask = CreateBitmap(cxBitmap, cyBitmap, 1, 1, NULL);
    25         hdcMemMask = CreateCompatibleDC(NULL);
    26         SelectObject(hdcMemMask, hBitmapMask);
    27         //color the mask bitmap black with a white ellipse
    28         SelectObject(hdcMemMask, GetStockObject(BLACK_BRUSH));
    29         Rectangle(hdcMemMask, 0, 0, cxBitmap, cyBitmap);
    30         SelectObject(hdcMemMask, GetStockObject(WHITE_BRUSH));
    31         Ellipse(hdcMemMask, 0, 0, cxBitmap, cyBitmap);
    32         // mask the original image
    33         BitBlt(hdcMemImag, 0, 0, cxBitmap, cyBitmap, hdcMemMask, 0, 0, SRCAND);
    34         DeleteDC(hdcMemImag);
    35         DeleteDC(hdcMemMask);
    36         return 0;
    37     case WM_SIZE:
    38         cxClient = LOWORD(lParam);
    39         cyClient = HIWORD(lParam);
    40         return 0;
    41     case WM_PAINT:
    42         hdc = BeginPaint(hwnd, &ps);
    43         // select bitmaps into memory dcs
    44         hdcMemImag = CreateCompatibleDC(hdc);
    45         SelectObject(hdcMemImag, hBitmapImag);
    46         hdcMemMask = CreateCompatibleDC(hdc);
    47         SelectObject(hdcMemMask, hBitmapMask);
    48         x = (cxClient - cxBitmap) / 2;
    49         y = (cyClient - cyBitmap) / 2;
    50         BitBlt(hdc, x, y, cxBitmap, cyBitmap, hdcMemMask, 0, 0, 0x220326);
    51         BitBlt(hdc, x, y, cxBitmap, cyBitmap, hdcMemImag, 0, 0, SRCPAINT);
    52 
    53         DeleteDC(hdcMemImag);
    54         DeleteDC(hdcMemMask);
    55         EndPaint(hwnd, &ps);
    56         return 0;
    57     case WM_DESTROY:
    58         DeleteObject(hBitmapImag);
    59         DeleteObject(hBitmapMask);
    60         PostQuitMessage(0);
    61         return 0;
    62     }
    63     return DefWindowProc(hwnd, message, wParam, lParam);
    64 }

    这里我一个错误就是第33行,我直接用srccopy进行操作,导致界面上没有任何的图像。应用了与的操作。

    每个图的操作:1、获取图像句柄,可以通过loadbitmap的方式,也可以通过createbitmap的方式进行。等方式。2、创建内存的句柄,createcompatiabledc的方式来操作。3、将图像句柄关联到内存中。公国selectobject的方式如第22行所示。这样一个图像就相当于已经关联到了一个内存中。

    通过BitBlt的方式,第33行所示,拷贝一个位图,从源设备复制到目标设备。这里通过按位与的方式来进行拷贝。也可通过简单的拷贝。只要最后一位参数由srcand改成srccopy即可。

    在显示完成之后需要将dc释放掉。deletedc的方式。讲不需要的内存句柄释放掉。

    这里,在第50行中,从原来的由边框位黑色,内部椭圆为白色变成内部椭圆为黑色,外部边框为黑色。这里是自定义的即:D&~S,将原来的进行与。

    在第51行中,进行了D|S的方式。从而目标图像被原封不动的复制出来。在这里原封不动的原因是因为之前的那个源的外部是黑色,而目标的内部是白色。所以两个与之后产生的是黑色

    在这里,selectobect得多看下的是:selects an object into the specified device context (DC). The new object replaces the previous object of the same type.

  • 相关阅读:
    《道德经》全文
    mysql 服务启动后停止
    安装docker-compose
    金刚般若波罗蜜经
    elasticsearch reIndex
    【基础篇】1.vim复制黏贴跳转
    新事物如何持续性发展
    舒服的状态
    教父
    关于拖延
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3477652.html
Copyright © 2020-2023  润新知