作者:516837745_d2d52c | 来源:互联网 | 2023-02-10 16:25
在进行图像的处理的时候,有时候需要进行图像的mask操作。以下是在windows程序设计第五版里面抄下来的。1LRESULTCALLBACKWndProc(HWNDhwnd,UIN
在进行图像的处理的时候,有时候需要进行图像的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.