日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DC保存至BMP图像

發布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);???????
  • ??????//hDC???=???m_pDc->GetSafeHdc();?????
  • ??????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;???//???;BM;??
  • ??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);?????
  • ????//???創建一個與屏幕設備描述表兼容的位圖,函數需要與CreateCompatibleDC配合使用?????
  • ????hBitmap?=?CreateCompatibleBitmap(hScrDC,?nWidth,?nHeight);?????
  • ????//???把新位圖選到內存設備描述表中?????
  • ????hOldBitmap?=?(HBITMAP)SelectObject(hMemDC,?hBitmap);?????
  • ????//???把屏幕設備描述表拷貝到內存設備描述表中??
  • ????//???StretchBlt函數從源矩形中復制一個位圖到目標矩形,必要時按目前目標設備設置的模式進行圖像的拉伸或壓縮。??
  • ????StretchBlt(hMemDC,0,0,nWidth,nHeight,??hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);??//?SRCCOPY??
  • ????//BitBlt(hMemDC,???0,???0,???nWidth,???nHeight,hScrDC,???nX,???nY,???SRCCOPY);?????
  • ????//???得到屏幕位圖的句柄???????
  • ??
  • ????hBitmap?=?(HBITMAP)SelectObject(hMemDC,?hOldBitmap);?????
  • ????//???清除???????
  • ??
  • ????//DeleteDC(hScrDC);?????
  • ????DeleteDC(hMemDC);?????
  • ????DeleteObject(hOldBitmap);?????
  • ????//???返回位圖句柄?????
  • ????return???hBitmap;?????
  • }?????
  • ??????
  • ??????
  • void?CGDI_test1View::On32771()?????
  • ??{?????
  • ??????//CDC?*pdc=?GetWindowDC();??
  • ??????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图像的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。