One day, i needed to accomply a weird(?) operation: modify a bitmap "in memory" and create a copy for my purposes, e.g. resizing it..
HBITMAP ResizeBmp(HWND hWnd,HBITMAP hBmp,int cx,int cy) { HDC dc =GetDC(hWnd); HDC copyDC = CreateCompatibleDC(dc); HDC srcDC = CreateCompatibleDC(dc); int oriCx,oriCy; //Get Original Size BITMAP bm; GetObject(hBmp, sizeof(bm),&bm); oriCx = bm.bmWidth; oriCy = bm.bmHeight; RECT bmpRect; bmpRect.top=0; bmpRect.left=0; bmpRect.right=cx; bmpRect.bottom=cy; RECT oriRect = bmpRect; oriRect.right=oriCx; oriRect.bottom=oriCy; HRGN rgn1 = CreateRectRgnIndirect( &bmpRect ); HRGN rgn2 = CreateRectRgnIndirect( &oriRect ); SelectClipRgn(copyDC,rgn1); SelectClipRgn(srcDC,rgn2); DeleteObject(rgn1); DeleteObject(rgn2); HBITMAP copyBMP = CreateCompatibleBitmap(dc,cx,cy); HBITMAP copyBMPold = (HBITMAP)SelectObject(copyDC,copyBMP); HBITMAP srcBMPold = (HBITMAP)SelectObject(srcDC,hBmp); if(oriCx!=cx || oriCy!=cy){ StretchBlt(copyDC,0,0,cx,cy,srcDC,0,0,oriCx,oriCy,SRCCOPY); }else{ BitBlt(copyDC,0,0,cx,cy,srcDC,0,0,SRCCOPY); } copyBMP = (HBITMAP)SelectObject(copyDC, copyBMPold); DeleteDC(copyDC); DeleteDC(srcDC); return copyBMP; }
Or resize it with a mask
HBITMAP ResizeBmpMask(HWND hWnd,HBITMAP hBmp,int cx,int cy,COLORREF clColor) { HDC dc =GetDC(hWnd); HDC copyDC = CreateCompatibleDC(dc); HDC srcDC = CreateCompatibleDC(dc); HDC maskDC = CreateCompatibleDC(dc); int oriCx,oriCy; //Get Original Size BITMAP bm; GetObject(hBmp, sizeof(bm),&bm); oriCx = bm.bmWidth; oriCy = bm.bmHeight; RECT bmpRect; bmpRect.top=0; bmpRect.left=0; bmpRect.right=cx; bmpRect.bottom=cy; RECT oriRect = bmpRect; oriRect.right=oriCx; oriRect.bottom=oriCy; HBITMAP maskBmp = GetBmpMask(hWnd,hBmp,cx,cy); HBITMAP sizedBmp = ResizeBmp(hWnd,hBmp,cx,cy); HRGN rgn1 = CreateRectRgnIndirect( &bmpRect ); HRGN rgn2 = CreateRectRgnIndirect( &bmpRect ); HRGN rgn3 = CreateRectRgnIndirect( &bmpRect ); SelectClipRgn(copyDC,rgn1); SelectClipRgn(srcDC,rgn2); SelectClipRgn(maskDC,rgn3); DeleteObject(rgn1); DeleteObject(rgn2); DeleteObject(rgn3); HBITMAP copyBMP = CreateCompatibleBitmap(dc,cx,cy); HBITMAP copyBMPold = (HBITMAP)SelectObject(copyDC,copyBMP); HBITMAP srcBMPold = (HBITMAP)SelectObject(srcDC,sizedBmp); HBITMAP maskBMPold = (HBITMAP)SelectObject(maskDC,maskBmp); FillRect(copyDC,&oriRect,CreateSolidBrush(clColor)); COLORREF clTransparent = GetPixel(srcDC,0,0); TransparentBlt(copyDC,0,0,cx,cy,srcDC,0,0,cx,cy,(UINT)clTransparent); copyBMP = (HBITMAP)SelectObject(copyDC, copyBMPold); DeleteDC(copyDC); DeleteDC(srcDC); return copyBMP; }