保存DC到BMP文件 win32

本文介绍了一种方法,用于将设备上下文(DC)的内容保存为位图(BMP)文件。通过创建兼容的内存DC,并使用CreateDIBSection创建位图对象,再通过StretchBlt函数将DC的内容绘制到位图上,最后构建BMP文件头并将位图数据写入文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  1. BOOL SaveDcToBMP(HDC m_hdcMem)  
  2. {  
  3.     BOOL        bReturn         = TRUE;  
  4.     HANDLE    hFile              = NULL;  //handle of bitmap file which will be saved  
  5.     DWORD     dwWritten     = 0;     //written count  
  6.     DWORD     dwOffsetSize = 0;  
  7.     DWORD     dwBufferSize = 0;  
  8.     WORD      wBitCount       = 32;   //位图中每个像素所占字节数    
  9.     HBITMAP   hbitmapSave  = NULL;  
  10.     HBITMAP   hbitmapOld   = NULL;  
  11.     HDC       hDcDev             = NULL;  
  12.     HDC       hDcMem       = NULL;  
  13.     BYTE      *pBmpBuffer  = NULL;  
  14.     int       iBits        = 0;  
  15.     BITMAP           stSrcbmp;  
  16.     BITMAPINFO       srcdibbmap;  
  17.     BITMAPFILEHEADER bmFileHeader; //位图文件头结构  
  18.     SecureZeroMemory(&stSrcbmp, sizeof(BITMAP));  
  19.     SecureZeroMemory(&srcdibbmap, sizeof(BITMAPINFO));  
  20.     SecureZeroMemory(&bmFileHeader, sizeof(BITMAPFILEHEADER));  
  21.     // Fill bitmap information constructor  
  22.     srcdibbmap.bmiHeader.biSize           = sizeof(BITMAPINFOHEADER);  
  23.     srcdibbmap.bmiHeader.biWidth          = WVGA_WIDTH;  
  24.     srcdibbmap.bmiHeader.biHeight         = WVGA_HIGHT;  
  25.     srcdibbmap.bmiHeader.biPlanes         = 1;  
  26.     srcdibbmap.bmiHeader.biBitCount       = wBitCount;  
  27.     srcdibbmap.bmiHeader.biCompression    = BI_RGB;  
  28.     hDcMem = CreateCompatibleDC(NULL);  
  29.     if (NULL == hDcMem)  
  30.     {  
  31.         bReturn = FALSE;  
  32.         goto Exit;  
  33.     }  
  34.     hbitmapSave = CreateDIBSection(hDcMem, &srcdibbmap, DIB_RGB_COLORS, (void**)&pBmpBuffer, NULL, 0);  
  35.     if (NULL == hbitmapSave)  
  36.     {  
  37.         bReturn = FALSE;  
  38.         goto Exit;  
  39.     }  
  40.     hbitmapOld  = (HBITMAP)SelectObject(hDcMem, hbitmapSave);  
  41.     if (NULL == hbitmapOld)  
  42.     {  
  43.         bReturn = FALSE;  
  44.         goto Exit;  
  45.     }  
  46.     //将传进来的DC画到定义的内存DC上去  
  47.     if(!StretchBlt(hDcMem,   
  48.                     0,   
  49.                     0,   
  50.                     WVGA_WIDTH,   
  51.                     WVGA_HIGHT,   
  52.                     m_hdcMem,   
  53.                     0,   
  54.                     0,   
  55.                     m_iScaleWidth,   
  56.                     m_iScaleHight,   
  57.                     SRCCOPY))  
  58.         {  
  59.             bReturn = FALSE;  
  60.             goto Exit;  
  61.         }  
  62.       
  63.     if (0 == GetObject(hbitmapSave, sizeof(stSrcbmp), &stSrcbmp))  
  64.     {  
  65.         bReturn = FALSE;  
  66.         goto Exit;  
  67.     }  
  68.     dwBufferSize = stSrcbmp.bmWidth * stSrcbmp.bmHeight * wBitCount / 8;  
  69.     dwOffsetSize = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);  
  70.     // Fill bitmap header constructor  
  71.     bmFileHeader.bfType = 0x4D42;       
  72.     bmFileHeader.bfSize = dwOffsetSize + dwBufferSize;  
  73.     bmFileHeader.bfReserved1 = 0;  
  74.     bmFileHeader.bfReserved2 = 0;  
  75.     bmFileHeader.bfOffBits   = dwOffsetSize;  
  76.       
  77.     hFile = CreateFile(m_wszPicPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
  78.     if (INVALID_HANDLE_VALUE == hFile)  
  79.     {  
  80.         bReturn = FALSE;  
  81.         goto Exit;  
  82.     }  
  83.     if (!WriteFile(hFile, &bmFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL))  
  84.     {  
  85.         bReturn = FALSE;  
  86.         goto Exit;  
  87.     }  
  88.     if (!WriteFile(hFile, &srcdibbmap, sizeof(BITMAPINFO), &dwWritten, NULL))  
  89.     {  
  90.         bReturn = FALSE;  
  91.         goto Exit;  
  92.     }  
  93.     if (!WriteFile(hFile, pBmpBuffer, dwBufferSize, &dwWritten, NULL))  
  94.     {  
  95.         bReturn = FALSE;  
  96.         goto Exit;  
  97.     }  
  98.     bReturn = TRUE;  
  99. Exit:  
  100.     if (INVALID_HANDLE_VALUE != hFile)  
  101.     {  
  102.         CloseHandle(hFile);  
  103.         hFile = INVALID_HANDLE_VALUE;  
  104.     }  
  105.     return bReturn;  
  106. }  

 

转自: http://blog.youkuaiyun.com/infsafe/archive/2010/01/05/5138768.aspx

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值