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.