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.

原文地址:https://www.cnblogs.com/cxiaoln/p/3477652.html