将HBITMAP句柄保存为本地bmp位图

来源:互联网 发布:centos7 查看php版本 编辑:程序博客网 时间:2024/05/21 21:49

 记录下......

 

  1. bool HBITMAP2Bmp(HBITMAP hBitmap, const CString & strFileName) 
  2. if(hBitmap == NULL) 
  3. return false
  4. HDC hDC; 
  5. int iBits; //当前分辨率下每象素所占字节数 
  6. WORD wBitCount; //位图中每象素所占字节数 
  7. DWORD dwPaletteSize=0; //定义调色板大小 
  8. DWORD dwBmBitsSize=0; //位图中像素字节大小 
  9. DWORD dwDIBSize=0; //位图文件大小 
  10. DWORD dwWritten=0; //位图文件大小 写入文件字节数 
  11. BITMAP Bitmap; //位图属性结构 
  12. BITMAPFILEHEADER bmfHdr; //位图文件头结构 
  13. BITMAPINFOHEADER bi; //位图信息头结构 
  14. LPBITMAPINFOHEADER lpbi = NULL;//指向位图信息头结构 
  15. HANDLE hDib, hPal, hOldPal = NULL; //定义文件,分配内存句柄,调色板句柄 
  16. //计算位图文件每个像素所占字节数 
  17. hDC = CreateDC("DISPLAY", NULL, NULL, NULL); 
  18. iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 
  19. DeleteDC(hDC); 
  20. if(iBits <= 1) 
  21. wBitCount = 1; 
  22. else if(iBits <= 4) 
  23. wBitCount = 4; 
  24. else if(iBits <= 8) 
  25. wBitCount = 8; 
  26. else 
  27. wBitCount = 24; 
  28. GetObject(hBitmap, sizeof(Bitmap),(LPSTR)&Bitmap); 
  29. bi.biSize = sizeof(BITMAPINFOHEADER); 
  30. bi.biWidth = Bitmap.bmWidth; 
  31. bi.biHeight = Bitmap.bmHeight; 
  32. if(Bitmap.bmWidth < 100 || Bitmap.bmHeight < 100) 
  33. return false
  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. dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight; 
  43. //为位图内容分配内存 
  44. hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); 
  45. lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); 
  46. *lpbi = bi; 
  47. hPal = GetStockObject(DEFAULT_PALETTE);//处理调色板 
  48. if(hPal) 
  49. hDC = ::GetDC(NULL); 
  50. hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); 
  51. RealizePalette(hDC); 
  52. //获取该调色板下新的像素值 
  53. int nRet = GetDIBits(hDC, 
  54. hBitmap, 
  55. 0, 
  56. (UINT)Bitmap.bmHeight, 
  57. (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize, 
  58. (BITMAPINFO *)lpbi, 
  59. DIB_RGB_COLORS); 
  60. if (0 == nRet) 
  61. nRet = 0; 
  62. //恢复调色板 
  63. if(hOldPal) 
  64. ::SelectPalette(hDC, (HPALETTE)hOldPal,TRUE); 
  65. RealizePalette(hDC); 
  66. ::ReleaseDC(NULL,hDC); 
  67. //设置位图文件头 
  68. bmfHdr.bfType = 0x4D42; // "BM" 
  69. dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; 
  70. bmfHdr.bfSize = dwDIBSize; 
  71. bmfHdr.bfReserved1 = 0; 
  72. bmfHdr.bfReserved2 = 0; 
  73. bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; 
  74. //创建位图文件 
  75. HANDLE fh = CreateFile(strFileName.operator LPCTSTR(), GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 
  76. if (fh == INVALID_HANDLE_VALUE) 
  77. int x = GetLastError(); 
  78. GlobalUnlock(hDib); 
  79. GlobalFree(hDib); 
  80. return FALSE; 
  81. //写入位图文件头 
  82. WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten,NULL); 
  83. //写入位图文件其余内容 
  84. WriteFile(fh, (LPSTR)lpbi, dwDIBSize - sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 
  85. //清除 
  86. CloseHandle(fh); 
  87. GlobalUnlock(hDib); 
  88. GlobalFree(hDib); 
  89. return true
原创粉丝点击