读写Bitmap

BOOL LoadBitmapFile(CString strFileName,CBitmap& bmp)
{
 CFile file;
 if( !file.Open(strFileName, CFile::modeRead) )
  return FALSE;

 BITMAPFILEHEADER bmfHeader;
 long nFileLen;

 nFileLen = file.GetLength();

 if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
  return FALSE;

 if (bmfHeader.bfType != ((WORD)('M' <<8) | 'B'))
  return FALSE;

 HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);
 if (hDIB == 0)
  return FALSE;

 if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=
  nFileLen - sizeof(BITMAPFILEHEADER) )
 {
  ::GlobalFree(hDIB);
  return FALSE;
 }

 BITMAPINFO &bmInfo = *(LPBITMAPINFO) ::GlobalLock(hDIB) ;
 BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER *)hDIB;

 int nHeaderSize=sizeof(BITMAPINFOHEADER); 
 BYTE *pBmpPixelBuffer=(BYTE *)&bmInfo+bmfHeader.bfOffBits - sizeof(BITMAPFILEHEADER);

 CDC dc;
 dc.CreateDC("DISPLAY",NULL,NULL,NULL);
 HBITMAP hBitmap;
 hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,CBM_INIT,(VOID *)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
 bmp.Attach (hBitmap);
 
 ::GlobalUnlock (hDIB);
 ::GlobalFree(hDIB);
 return TRUE;
}

void DrawBmp (CBitmap& bmp)
{
 CDC* pDC = GetDC();
 CDC memDC;
 memDC.CreateCompatibleDC (NULL);
 CBitmap* pOldBmp = memDC.SelectObject (&bmp);

 BITMAP bm;
 bmp.GetBitmap (&bm);
 int nWidth = bm.bmWidth;
 int nHeight = bm.bmHeight;

 pDC->BitBlt (0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);
 
 memDC.SelectObject (pOldBmp);
}

 

 

BOOL SaveBitmapFile(CString strFileName,CBitmap& bmp)
{
 BITMAP bm;
 bmp.GetBitmap (&bm);
 
 int nWidth = bm.bmWidth;
 int nHeight = bm.bmHeight;
 
 int nLineBits = bm.bmWidthBytes;
 if ((nLineBits % 8) != 0)
  nLineBits += 8 - nLineBits%8;

 int nBitCounts = nLineBits * bm.bmHeight ;

 int nBits = bm.bmBitsPixel;
 int nBitmapInfoSize = 0;

 if (nBits <= 8)
 {
  int nColors = 1 << nBits;
  int nPalUnitSize = sizeof(RGBQUAD);
  nBitmapInfoSize = sizeof(BITMAPINFOHEADER) + nPalUnitSize * nColors; 
 }
 else
  nBitmapInfoSize = sizeof(BITMAPINFOHEADER);

 BITMAPINFO* pbmpinfo = NULL;

 pbmpinfo =(BITMAPINFO *)(new BYTE[nBitmapInfoSize]);
 ZeroMemory((void *)pbmpinfo,nBitmapInfoSize);
 
 BITMAPINFOHEADER* pInfoHead = (BITMAPINFOHEADER *)pbmpinfo;
 ZeroMemory((void *)pInfoHead,sizeof(BITMAPINFOHEADER));

 pInfoHead->biSize = sizeof(BITMAPINFOHEADER);
 pInfoHead->biBitCount = nBits;
 pInfoHead->biPlanes = 1;
 pInfoHead->biSizeImage = nBitCounts;
 pInfoHead->biCompression = BI_RGB;
 pInfoHead->biWidth = nWidth;
 pInfoHead->biHeight = nHeight;

 CDC dc;
 dc.CreateDC("DISPLAY",NULL,NULL,NULL);

 int nLx = dc.GetDeviceCaps (LOGPIXELSX);
 int nLy = dc.GetDeviceCaps (LOGPIXELSY);

 double dbInchPerMeter = 39.375;

 int nPMx = (int)((double)nLx * dbInchPerMeter);
 int nPMy = (int)((double)nLy * dbInchPerMeter);

 pInfoHead->biXPelsPerMeter = nPMx;//3780;
 pInfoHead->biYPelsPerMeter = nPMy;//3780;
 
 if (nBits <= 8)
 {
  int nColors = 1 << nBits;
  GetDIBColorTable(dc.m_hDC,0,nColors,pbmpinfo->bmiColors);
 }

 BYTE* pBits = NULL;
 
 HGLOBAL hGlobal = ::GlobalAlloc(GMEM_FIXED, nBitCounts);
 pBits = (BYTE *)::GlobalLock(hGlobal);
 ZeroMemory((void *)pBits,nBitCounts);
 
 GetDIBits(dc.m_hDC,(HBITMAP)bmp,0,nHeight,pBits,pbmpinfo,DIB_RGB_COLORS);

 BITMAPFILEHEADER bmfHeader;
 int nFileHeadSize = sizeof(BITMAPFILEHEADER);
 
 ZeroMemory((void *)&bmfHeader,sizeof(BITMAPFILEHEADER));
 bmfHeader.bfType = 19778;//'BM'    ((WORD) ('M' << 8) | 'B');
 bmfHeader.bfSize = nFileHeadSize + nBitmapInfoSize + nBitCounts;
 bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + nBitmapInfoSize;

 CFile file;
 if(!file.Open (strFileName,CFile::modeCreate | CFile::modeWrite))
 {
  AfxMessageBox("Write File Error!");
  return FALSE;
 }

 file.Write (&bmfHeader,sizeof(BITMAPFILEHEADER));
 file.Write (pbmpinfo,nBitmapInfoSize);

 file.WriteHuge (pBits, nBitCounts);
 file.Close ();

 ::GlobalUnlock (hGlobal);
 ::GlobalFree (hGlobal);
 delete[] pbmpinfo;

 return TRUE;
}

posted @ 2009-03-13 14:55  笑三少  阅读(902)  评论(0)    收藏  举报