C++将HBITMAP保存为bmp图片

  1. 引用:https://blog.csdn.net/shufac/article/details/49997947

  2. BOOL CBMP2ArrayMultiplyDlg::SaveBitmapToFile(HBITMAP   hBitmap, CString szfilename)  
  3. {  
  4.     HDC     hDC;           
  5.     //当前分辨率下每象素所占字节数            
  6.     int     iBits;           
  7.     //位图中每象素所占字节数            
  8.     WORD     wBitCount;           
  9.     //定义调色板大小,     位图中像素字节大小     ,位图文件大小     ,     写入文件字节数                
  10.     DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;               
  11.     //位图属性结构                
  12.     BITMAP     Bitmap;                   
  13.     //位图文件头结构            
  14.     BITMAPFILEHEADER     bmfHdr;                   
  15.     //位图信息头结构                
  16.     BITMAPINFOHEADER     bi;                   
  17.     //指向位图信息头结构                    
  18.     LPBITMAPINFOHEADER     lpbi;                   
  19.     //定义文件,分配内存句柄,调色板句柄                
  20.     HANDLE     fh,   hDib,   hPal,hOldPal=NULL;               
  21.   
  22.     //计算位图文件每个像素所占字节数                
  23.     hDC  = CreateDC("DISPLAY",   NULL,   NULL,   NULL);           
  24.     iBits  = GetDeviceCaps(hDC,   BITSPIXEL)     *     GetDeviceCaps(hDC,   PLANES);               
  25.     DeleteDC(hDC);               
  26.     if(iBits <=  1)                                                     
  27.         wBitCount = 1;               
  28.     else  if(iBits <=  4)                                 
  29.         wBitCount  = 4;               
  30.     else if(iBits <=  8)                                 
  31.         wBitCount  = 8;               
  32.     else                                                                                                                                 
  33.         wBitCount  = 24;  
  34.   
  35.     GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);           
  36.     bi.biSize= sizeof(BITMAPINFOHEADER);           
  37.     bi.biWidth = Bitmap.bmWidth;           
  38.     bi.biHeight =  Bitmap.bmHeight;           
  39.     bi.biPlanes =  1;           
  40.     bi.biBitCount = wBitCount;           
  41.     bi.biCompression= BI_RGB;           
  42.     bi.biSizeImage=0;           
  43.     bi.biXPelsPerMeter = 0;           
  44.     bi.biYPelsPerMeter = 0;           
  45.     bi.biClrImportant = 0;           
  46.     bi.biClrUsed =  0;           
  47.   
  48.     dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;           
  49.   
  50.     //为位图内容分配内存                
  51.     hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));               
  52.     lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);               
  53.     *lpbi  = bi;               
  54.   
  55.     //     处理调色板                    
  56.     hPal  = GetStockObject(DEFAULT_PALETTE);               
  57.     if (hPal)               
  58.     {               
  59.         hDC  = ::GetDC(NULL);               
  60.         hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);               
  61.         RealizePalette(hDC);               
  62.     }           
  63.   
  64.     //     获取该调色板下新的像素值                
  65.     GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,    
  66.         (LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize,     
  67.         (BITMAPINFO *)lpbi, DIB_RGB_COLORS);               
  68.   
  69.     //恢复调色板                    
  70.     if (hOldPal)               
  71.     {               
  72.         ::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);               
  73.         RealizePalette(hDC);               
  74.         ::ReleaseDC(NULL,   hDC);               
  75.     }               
  76.   
  77.     //创建位图文件                    
  78.     fh  = CreateFile(szfilename,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,             
  79.         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);               
  80.   
  81.     if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;               
  82.   
  83.     //     设置位图文件头                
  84.     bmfHdr.bfType  = 0x4D42;     //     "BM"                
  85.     dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;                   
  86.     bmfHdr.bfSize  = dwDIBSize;               
  87.     bmfHdr.bfReserved1  = 0;               
  88.     bmfHdr.bfReserved2  = 0;               
  89.     bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;               
  90.     //     写入位图文件头                
  91.     WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);               
  92.     //     写入位图文件其余内容                
  93.     WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,   &dwWritten,   NULL);               
  94.     //清除                    
  95.     GlobalUnlock(hDib);               
  96.     GlobalFree(hDib);               
  97.     CloseHandle(fh);               
  98.   
  99.     return     TRUE;           
  100.   
  101. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值