hur.cn - 华软网

 热门搜索

HBITMAP转BITMAPINFOHEADER问题?

  作者:未知    来源:网络    更新时间:2011/9/29
我用内存绘制了一张HBITMAP图片,想把他转成BITMAPINFOHEADER改怎么做?也就是得到BITMAPINFOHEADER的数据,谢谢!


---华软 网友回答---
GetObject
---华软网友回复---
参考这个
C++">
   //把HBITMAP保存成位图
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{

if(hBitmap==NULL || FileName.IsEmpty())

  {

   AfxMessageBox("参数错误");

return false;

}


 HDC hDC;
 //当前分辨率下每象素所占字节数
 int iBits;
 //位图中每象素所占字节数
 WORD wBitCount;
 //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; 
 //位图属性结构 
 BITMAP Bitmap;  
 //位图文件头结构
 BITMAPFILEHEADER bmfHdr;  
 //位图信息头结构 
 BITMAPINFOHEADER bi;  
 //指向位图信息头结构  
 LPBITMAPINFOHEADER lpbi;  
 //定义文件,分配内存句柄,调色板句柄 
 HANDLE fh, hDib, hPal,hOldPal=NULL; 
 
 //计算位图文件每个像素所占字节数 
 hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
 iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 
 DeleteDC(hDC); 
 if (iBits <= 1)  wBitCount = 1; 
 else if (iBits <= 4)  wBitCount = 4; 
 else if (iBits <= 8)  wBitCount = 8; 
 else      wBitCount = 24; 
 
 GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
 bi.biSize   = sizeof(BITMAPINFOHEADER);
 bi.biWidth   = Bitmap.bmWidth;
 bi.biHeight   = Bitmap.bmHeight;
 bi.biPlanes   = 1;
 bi.biBitCount  = wBitCount;
 bi.biCompression = BI_RGB;
 bi.biSizeImage  = 0;
 bi.biXPelsPerMeter = 0;
 bi.biYPelsPerMeter = 0;
 bi.biClrImportant = 0;
 bi.biClrUsed  = 0;
 
 dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
 
 //为位图内容分配内存 
 hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); 
 lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); 
 *lpbi = bi; 

 // 处理调色板  
 hPal = GetStockObject(DEFAULT_PALETTE); 
 if (hPal) 
 { 
  hDC = ::GetDC(NULL); 
  hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); 
  RealizePalette(hDC); 
 }

 // 获取该调色板下新的像素值 
 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) 
   +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); 
 
 //恢复调色板  
 if (hOldPal) 
 { 
  ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
  RealizePalette(hDC); 
  ::ReleaseDC(NULL, hDC); 
 } 

 //创建位图文件  
 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 
     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 
 
 if (fh == INVALID_HANDLE_VALUE)  return FALSE; 
 
 // 设置位图文件头 
 bmfHdr.bfType = 0x4D42; // "BM" 
 dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  
 bmfHdr.bfSize = dwDIBSize; 
 bmfHdr.bfReserved1 = 0; 
 bmfHdr.bfReserved2 = 0; 
 bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; 
 // 写入位图文件头 
 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 
 // 写入位图文件其余内容 
 WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); 
 //清除  
 GlobalUnlock(hDib); 
 GlobalFree(hDib); 
 CloseHandle(fh); 

 return TRUE;
}



---华软网友回复---
信息头是自己生成的,可参考LS。
---华软网友回复---
好的

我试试      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。