生活随笔
收集整理的這篇文章主要介紹了
DC保存至BMP图像
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[cpp]?view plaincopy
BOOL?SaveBmp(HBITMAP?hBitmap,?CString?FileName)????? ??{????? ??HDC???hDC;????? ???? ??int???iBits;????? ???? ??WORD??wBitCount;????? ???? ??DWORD?dwPaletteSize=0,?dwBmBitsSize=0,?dwDIBSize=0,?dwWritten=0;??????? ???? ??BITMAP???Bitmap;????????? ???? ??BITMAPFILEHEADER???bmfHdr;????????? ???? ??BITMAPINFOHEADER???bi;????????? ???? ??LPBITMAPINFOHEADER?lpbi;????????? ???? ??HANDLE??fh,?hDib,?hPal,?hOldPal=NULL;??????? ?????? ???? ??hDC???=?CreateDC(_T("DISPLAY"),?NULL,?NULL,?NULL);????? ??iBits?=?GetDeviceCaps(hDC,?BITSPIXEL)?*?GetDeviceCaps(hDC,?PLANES);??????? ??DeleteDC(hDC);??????? ??if?(iBits?<=?1)wBitCount?=?1;??????? ??else?if?(iBits?<=?4)?wBitCount?=?4;??????? ??else?if?(iBits?<=?8)?wBitCount?=?8;??????? ??else?wBitCount?=?24;??????? ?????? ??GetObject(hBitmap,?sizeof(Bitmap),?(LPSTR)&Bitmap);????? ??bi.biSize?=?sizeof(BITMAPINFOHEADER);????? ??bi.biWidth?=?Bitmap.bmWidth;????? ??bi.biHeight?=?Bitmap.bmHeight;????? ??bi.biPlanes?=?1;????? ??bi.biBitCount?=?wBitCount;????? ??bi.biCompression?=?BI_RGB;????? ??bi.biSizeImage?=?0;????? ??bi.biXPelsPerMeter?=?0;????? ??bi.biYPelsPerMeter?=?0;????? ??bi.biClrImportant?=?0;????? ??bi.biClrUsed?=?0;????? ?????? ??dwBmBitsSize?=?((Bitmap.bmWidth?*?wBitCount?+?31)?/?32)?*?4?*?Bitmap.bmHeight;????? ?????? ???? ??hDib??=?GlobalAlloc(GHND,dwBmBitsSize?+?dwPaletteSize?+?sizeof(BITMAPINFOHEADER));??????? ??lpbi??=?(LPBITMAPINFOHEADER)GlobalLock(hDib);??????? ??*lpbi?=?bi;??????? ?????? ???? ??hPal??=?GetStockObject(DEFAULT_PALETTE);??????? ??if???(hPal)??????? ??{??????? ??????hDC?=?::GetDC(NULL);??????? ???????? ??????hOldPal?=?::SelectPalette(hDC,?(HPALETTE)hPal,?FALSE);??????? ??????RealizePalette(hDC);??????? ??}????? ???? ??GetDIBits(hDC,?hBitmap,?0,?(UINT)Bitmap.bmHeight,?(LPSTR)lpbi?+?sizeof(BITMAPINFOHEADER)??????? ????????????????????????????????????????????+dwPaletteSize,(BITMAPINFO?*)lpbi,?DIB_RGB_COLORS);??????? ?????? ???? ??if?(hOldPal)?? ??{?? ??????::SelectPalette(hDC,?(HPALETTE)hOldPal,?TRUE);??? ??????RealizePalette(hDC);?? ??????::ReleaseDC(NULL,?hDC);?? ??}?????? ?????? ???? ??fh?=?CreateFile(FileName,?GENERIC_WRITE,?0,?NULL,?CREATE_ALWAYS,?? ????????????????????????????????FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,?NULL);?? ?????? ??if?(fh?==?INVALID_HANDLE_VALUE)??? ??????return?FALSE;?? ?????? ???? ??bmfHdr.bfType?=?0x4D42;????? ??dwDIBSize???=?sizeof(BITMAPFILEHEADER)?+?sizeof(BITMAPINFOHEADER)?+?dwPaletteSize?+?dwBmBitsSize;?? ??bmfHdr.bfSize???=?dwDIBSize;?? ??bmfHdr.bfReserved1?=?0;?? ??bmfHdr.bfReserved2?=?0;?? ??bmfHdr.bfOffBits???=?(DWORD)sizeof(BITMAPFILEHEADER)?+?(DWORD)sizeof(BITMAPINFOHEADER)?+?dwPaletteSize;?? ???? ??WriteFile(fh,?(LPSTR)&bmfHdr,?sizeof(BITMAPFILEHEADER),?&dwWritten,?NULL);?? ???? ??WriteFile(fh,?(LPSTR)lpbi,?dwDIBSize,?&dwWritten,?NULL);?? ???? ??GlobalUnlock(hDib);?? ??GlobalFree(hDib);?? ??CloseHandle(fh);?? ?????? ??return?TRUE;?? ??}????? ?????? ?????? HBITMAP?CopyDCToBitmap(HDC?hScrDC,?LPRECT?lpRect)????? {????? ????HDC??hMemDC;????????????????? ?????? ????HBITMAP?hBitmap,hOldBitmap;??????????? ?????? ????int??nX,?nY,?nX2,?nY2;????????????????? ?????? ????int??nWidth,?nHeight;????????????????? ?????? ?? ?????? ????if???(IsRectEmpty(lpRect))????? ????return???NULL;????? ?? ?????? ????nX???=?lpRect->left;????? ????nY???=?lpRect->top;????? ????nX2??=?lpRect->right;????? ????nY2??=?lpRect->bottom;????? ????nWidth??=?nX2?-?nX;????? ????nHeight?=?nY2?-?nY;????? ?????? ????hMemDC??=?CreateCompatibleDC(hScrDC);????? ?????? ????hBitmap?=?CreateCompatibleBitmap(hScrDC,?nWidth,?nHeight);????? ?????? ????hOldBitmap?=?(HBITMAP)SelectObject(hMemDC,?hBitmap);????? ?????? ?????? ????StretchBlt(hMemDC,0,0,nWidth,nHeight,??hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);???? ?????? ?????? ?? ????hBitmap?=?(HBITMAP)SelectObject(hMemDC,?hOldBitmap);????? ?????? ?? ?????? ????DeleteDC(hMemDC);????? ????DeleteObject(hOldBitmap);????? ?????? ????return???hBitmap;????? }????? ?????? ?????? void?CGDI_test1View::On32771()????? ??{????? ???????? ??????CDC?*pdc=?GetDC();????? ??????HBITMAP?hBmp;????? ??????pdc->TextOut(10,10,_T("abcd"));????? ??????CRect?rt(10,10,500,500);????? ?????????? ??????LPRECT?lprt=&rt;????? ???????????? ??????pdc->Ellipse(rt);????? ?????????? ??????hBmp=CopyDCToBitmap(pdc->GetSafeHdc(),?lprt);????? ??????SaveBmp(hBmp,?_T("c://11.bmp"));????? ??}??
總結
以上是生活随笔為你收集整理的DC保存至BMP图像的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。