DC保存至BMP图像


[cpp]  view plain  copy
  1. BOOL SaveBmp(HBITMAP hBitmap, CString FileName)     
  2.   {     
  3.   HDC   hDC;     
  4.   //当前分辨率下每象素所占字节数     
  5.   int   iBits;     
  6.   //位图中每象素所占字节数     
  7.   WORD  wBitCount;     
  8.   //定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数  
  9.   DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;       
  10.   //位图属性结构       
  11.   BITMAP   Bitmap;         
  12.   //位图文件头结构     
  13.   BITMAPFILEHEADER   bmfHdr;         
  14.   //位图信息头结构       
  15.   BITMAPINFOHEADER   bi;         
  16.   //指向位图信息头结构         
  17.   LPBITMAPINFOHEADER lpbi;         
  18.   //定义文件,分配内存句柄,调色板句柄       
  19.   HANDLE  fh, hDib, hPal, hOldPal=NULL;       
  20.       
  21.   //计算位图文件每个像素所占字节数       
  22.   hDC   = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);     
  23.   iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);       
  24.   DeleteDC(hDC);       
  25.   if (iBits <= 1)wBitCount = 1;       
  26.   else if (iBits <= 4) wBitCount = 4;       
  27.   else if (iBits <= 8) wBitCount = 8;       
  28.   else wBitCount = 24;       
  29.       
  30.   GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);     
  31.   bi.biSize = sizeof(BITMAPINFOHEADER);     
  32.   bi.biWidth = Bitmap.bmWidth;     
  33.   bi.biHeight = Bitmap.bmHeight;     
  34.   bi.biPlanes = 1;     
  35.   bi.biBitCount = wBitCount;     
  36.   bi.biCompression = BI_RGB;     
  37.   bi.biSizeImage = 0;     
  38.   bi.biXPelsPerMeter = 0;     
  39.   bi.biYPelsPerMeter = 0;     
  40.   bi.biClrImportant = 0;     
  41.   bi.biClrUsed = 0;     
  42.       
  43.   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;     
  44.       
  45.   //   为位图内容分配内存       
  46.   hDib  = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));       
  47.   lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);       
  48.   *lpbi = bi;       
  49.       
  50.   //   处理调色板         
  51.   hPal  = GetStockObject(DEFAULT_PALETTE);       
  52.   if   (hPal)       
  53.   {       
  54.       hDC = ::GetDC(NULL);       
  55.       //hDC   =   m_pDc->GetSafeHdc();     
  56.       hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);       
  57.       RealizePalette(hDC);       
  58.   }     
  59.   //   获取该调色板下新的像素值       
  60.   GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)       
  61.                                             +dwPaletteSize,(BITMAPINFO *)lpbi, DIB_RGB_COLORS);       
  62.       
  63.   //   恢复调色板         
  64.   if (hOldPal)  
  65.   {  
  66.       ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);   
  67.       RealizePalette(hDC);  
  68.       ::ReleaseDC(NULL, hDC);  
  69.   }      
  70.       
  71.   //   创建位图文件         
  72.   fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,  
  73.                                 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);  
  74.       
  75.   if (fh == INVALID_HANDLE_VALUE)   
  76.       return FALSE;  
  77.       
  78.   //   设置位图文件头       
  79.   bmfHdr.bfType = 0x4D42;   //   ;BM;  
  80.   dwDIBSize   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  
  81.   bmfHdr.bfSize   = dwDIBSize;  
  82.   bmfHdr.bfReserved1 = 0;  
  83.   bmfHdr.bfReserved2 = 0;  
  84.   bmfHdr.bfOffBits   = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;  
  85.   //   写入位图文件头  
  86.   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);  
  87.   //   写入位图文件其余内容  
  88.   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);  
  89.   //   清除  
  90.   GlobalUnlock(hDib);  
  91.   GlobalFree(hDib);  
  92.   CloseHandle(fh);  
  93.       
  94.   return TRUE;  
  95.   }     
  96.       
  97.       
  98. HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect)     
  99. {     
  100.     HDC  hMemDC;                 
  101.     //   屏幕和内存设备描述表     
  102.     HBITMAP hBitmap,hOldBitmap;           
  103.     //   位图句柄     
  104.     int  nX, nY, nX2, nY2;                 
  105.     //   选定区域坐标     
  106.     int  nWidth, nHeight;                 
  107.     //   位图宽度和高度     
  108.   
  109.     //   确保选定区域不为空矩形     
  110.     if   (IsRectEmpty(lpRect))     
  111.     return   NULL;     
  112.   
  113.     //   获得选定区域坐标     
  114.     nX   = lpRect->left;     
  115.     nY   = lpRect->top;     
  116.     nX2  = lpRect->right;     
  117.     nY2  = lpRect->bottom;     
  118.     nWidth  = nX2 - nX;     
  119.     nHeight = nY2 - nY;     
  120.     //   为屏幕设备描述表创建兼容的内存设备描述表     
  121.     hMemDC  = CreateCompatibleDC(hScrDC);     
  122.     //   创建一个与屏幕设备描述表兼容的位图,函数需要与CreateCompatibleDC配合使用     
  123.     hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);     
  124.     //   把新位图选到内存设备描述表中     
  125.     hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);     
  126.     //   把屏幕设备描述表拷贝到内存设备描述表中  
  127.     //   StretchBlt函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。  
  128.     StretchBlt(hMemDC,0,0,nWidth,nHeight,  hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);  // SRCCOPY  
  129.     //BitBlt(hMemDC,   0,   0,   nWidth,   nHeight,hScrDC,   nX,   nY,   SRCCOPY);     
  130.     //   得到屏幕位图的句柄       
  131.   
  132.     hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);     
  133.     //   清除       
  134.   
  135.     //DeleteDC(hScrDC);     
  136.     DeleteDC(hMemDC);     
  137.     DeleteObject(hOldBitmap);     
  138.     //   返回位图句柄     
  139.     return   hBitmap;     
  140. }     
  141.       
  142.       
  143. void CGDI_test1View::On32771()     
  144.   {     
  145.       //CDC *pdc= GetWindowDC();  
  146.       CDC *pdc= GetDC();     
  147.       HBITMAP hBmp;     
  148.       pdc->TextOut(10,10,_T("abcd"));     
  149.       CRect rt(10,10,500,500);     
  150.           
  151.       LPRECT lprt=&rt;     
  152.             
  153.       pdc->Ellipse(rt);     
  154.           
  155.       hBmp=CopyDCToBitmap(pdc->GetSafeHdc(), lprt);     
  156.       SaveBmp(hBmp, _T("c://11.bmp"));     
  157.   }  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在截图保存BMP 文件之前就将其导出为图片数据,可以使用与上面代码类似的方式读取窗口的像素数据,然后将其转换为 NumPy 数组。以下是一个示例代码: ```python import numpy as np import win32gui import win32ui import win32con # 获取窗口句柄 hwnd = win32gui.FindWindow(None, "窗口标题") # 获取窗口位置 left, top, right, bottom = win32gui.GetWindowRect(hwnd) width = right - left height = bottom - top # 创建设备描述表 hwndDC = win32gui.GetWindowDC(hwnd) mfcDC = win32ui.CreateDCFromHandle(hwndDC) saveDC = mfcDC.CreateCompatibleDC() # 创建位图对象 saveBitMap = win32ui.CreateBitmap() saveBitMap.CreateCompatibleBitmap(mfcDC, width, height) # 将截图保存到位图对象中 saveDC.SelectObject(saveBitMap) saveDC.BitBlt((0, 0), (width, height), mfcDC, (0, 0), win32con.SRCCOPY) # 将位图对象转换为 NumPy 数组 bmpinfo = saveBitMap.GetInfo() bmpstr = saveBitMap.GetBitmapBits(True) img = np.frombuffer(bmpstr, dtype=np.uint8).reshape((height, width, -1)) # 释放资源 win32gui.DeleteObject(saveBitMap.GetHandle()) saveDC.DeleteDC() mfcDC.DeleteDC() win32gui.ReleaseDC(hwnd, hwndDC) # 输出图片大小 print('Image size:', img.shape) # 输出图片数据 print('Image data:', img) ``` 在上面的代码中,`GetBitmapBits()` 函数会返回位图对象的像素数据,然后使用 NumPy 的 `frombuffer()` 函数将其转换为 NumPy 数组。你可以使用 `shape` 属性获取图片的大小,使用数组本身来获取图片的数据。 希望这可以帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值