browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

将位图句柄保存为BMP文件

Posted by on 2004 年 10 月 24 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

C++代码
  1. BOOL SaveToFile(HBITMAP hBitmap, LPCTSTR lpszFileName)   
  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("DISPLAY", NULL, NULL, NULL);   
  23.   iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);   
  24.   DeleteDC(hDC);   
  25.   if (iBits <= 1)   
  26.     wBitCount = 1;   
  27.   else if (iBits <= 4)   
  28.     wBitCount = 4;   
  29.   else if (iBits <= 8)   
  30.     wBitCount = 8;   
  31.   else  
  32.     wBitCount = 24;   
  33.   GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);   
  34.   bi.biSize = sizeof(BITMAPINFOHEADER);   
  35.   bi.biWidth = Bitmap.bmWidth;   
  36.   bi.biHeight = Bitmap.bmHeight;   
  37.   bi.biPlanes = 1;   
  38.   bi.biBitCount = wBitCount;   
  39.   bi.biCompression = BI_RGB;   
  40.   bi.biSizeImage = 0;   
  41.   bi.biXPelsPerMeter = 0;   
  42.   bi.biYPelsPerMeter = 0;   
  43.   bi.biClrImportant = 0;   
  44.   bi.biClrUsed = 0;   
  45.   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;   
  46.   //为位图内容分配内存    
  47.   hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));   
  48.   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);   
  49.   *lpbi = bi;   
  50.   // 处理调色板     
  51.   hPal = GetStockObject(DEFAULT_PALETTE);   
  52.   if (hPal)   
  53.   {    
  54.     hDC = GetDC(NULL);   
  55.     hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);   
  56.     RealizePalette(hDC);   
  57.   }   
  58.      
  59.   // 获取该调色板下新的像素值   
  60.   GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)    
  61.     +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);   
  62.   //恢复调色板   
  63.   if (hOldPal)   
  64.   {   
  65.     SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);   
  66.     RealizePalette(hDC);   
  67.     ReleaseDC(NULL, hDC);   
  68.   }   
  69.   //创建位图文件     
  70.   fh = CreateFile(lpszFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,    
  71.     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);    
  72.      
  73.   if (fh == INVALID_HANDLE_VALUE)   
  74.     return FALSE;    
  75.   // 设置位图文件头    
  76.   bmfHdr.bfType = 0x4D42; // "BM"   
  77.   dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;   
  78.   bmfHdr.bfSize = dwDIBSize;   
  79.   bmfHdr.bfReserved1 = 0;   
  80.   bmfHdr.bfReserved2 = 0;   
  81.   bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;   
  82.   // 写入位图文件头   
  83.   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);   
  84.   // 写入位图文件其余内容   
  85.   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);   
  86.   //清除   
  87.   GlobalUnlock(hDib);   
  88.   GlobalFree(hDib);   
  89.   CloseHandle(fh);   
  90.   return TRUE;   
  91. }  

代码说明:
hBitmap:要保存的位图句柄。
lpszFileName:要保存的BMP文件名。
返回值:成功返回TRUE,否则返回FALSE。

订阅本站

没有评论

(Required)
(Required, will not be published)