BOOL CBmp::loadBitmapFile(CString
path,CBitmap&bitmap)
{
CFile file;
nLineBits += 4 - nLineBits%4;
int nBitCounts = nLineBits * bm.bmHeight;
if( !file.Open(path, CFile::modeRead) )
return FALSE;
int nBits = bm.bmBitsPixel;//每个像素的位数
int nBitmapinfoSize = 0;
BITMAPFILEHEADER bmfHeader;
long fileLen = file.GetLength();
if(nBits <= 8)
{
if(file.Read(&bmfHeader,sizeof(bmfHeader)) !=
sizeof(bmfHeader))
return FALSE;
if(bmfHeader.bfType != 0x4d42)
return FALSE;
HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED,fileLen);
if(hDIB == 0)
return FALSE;
if(file.Read(hDIB,fileLen -
sizeof(BITMAPFILEHEADER)) !=
int nColor = 1 << nBits;
int nPalUnitSize = sizeof(RGBQUAD);
nBitmapinfoSize = sizeof(BITMAPINFOHEADER) +
nPalUnitSize * nColor;
}
else
nBitmapinfoSize = sizeof(BITMAPINFOHEADER);
BITMAPINFO *pbmpinfo = NULL;
pbmpinfo = (BITMAPINFO*)(new
BYTE[nBitmapinfoSize]);
ZeroMemory((void *)pbmpinfo,nBitmapinfoSize);//将
fileLen - sizeof(BITMAPFILEHEADER) )
该段内存中的值初始化为
{
}
::GlobalFree(hDIB);
return FALSE;
BITMAPINFO &bmInfo =
*(LPBITMAPINFO)::GlobalLock(hDIB);
BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER
*)hDIB;
int headerSize = 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,DI
B_RGB_COLORS);
bitmap.Attach(hBitmap);
::GlobalUnlock (hDIB);
::GlobalFree(hDIB);
return TRUE;
BITMAPINFOHEADER *pInfoHeader =
(BITMAPINFOHEADER*)pbmpinfo;//BITMAPINFOHEADER的首地
址与BITMAPINFO相同
ZeroMemory((void*)pInfoHeader,sizeof(BITMAPINFOHEADE
R));
pInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
pInfoHeader->biWidth = nWidth;
pInfoHeader->biBitCount = nBits;
pInfoHeader->biPlanes = 1;
pInfoHeader->biSizeImage = nBitCounts;
pInfoHeader->biCompression = BI_RGB;
pInfoHeader->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);
pInfoHeader->biXPelsPerMeter = nPMx;
pInfoHeader->biYPelsPerMeter = nPMy;
if(nBits <= 8)
{
throw(gcnew System::NotImplementedException);
int nColors = 1 << nBits;
}
BOOL CBmp::bmpSave(CBitmap& m_bitmap, CString
filename)
{
BITMAP bm;
m_bitmap.GetBitmap(&bm);
int nWidth = bm.bmWidth;//每行的像素数
int nHeight = bm.bmHeight;//列的像素数
int nLineBits = bm.bmWidthBytes;//每行的像素数
if ((nLineBits % 4) != 0)
GetDIBColorTable(dc.m_hDC,0,nColors,pbmpinfo->bmiCol
ors);
}
BYTE* pBits = NULL;
HGLOBAL hGlobal
= ::GlobalAlloc(GMEM_FIXED,nBitCounts);//存储
BITMAPINFO结构体
pBits = (BYTE*)::GlobalLock(hGlobal);
ZeroMemory((void*)pBits,nBitCounts);
GetDIBits(dc.m_hDC,(HBITMAP)m_bitmap,0,nHeight,pBits,
pbmpinfo,DIB_RGB_COLORS);
BITMAPFILEHEADER bmfHeader;
int nFileHeadSize = sizeof(BITMAPFILEHEADER);
ZeroMemory((void*)&bmfHeader,sizeof(BITMAPFILEHEADER)
);
bmfHeader.bfType = 0x4d42;
bmfHeader.bfSize = nFileHeadSize + nBitmapinfoSize
+ nBitCounts;
bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) +
nBitmapinfoSize;
CFile savetoFile;
if(!savetoFile.Open(filename,CFile::modeCreate|
CFile::modeWrite))
return FALSE;
savetoFile.Write(&bmfHeader,sizeof(BITMAPFILEHEADER))
;
savetoFile.Write(pbmpinfo,nBitmapinfoSize);
savetoFile.Write(pBits,nBitCounts);
savetoFile.Close();
::GlobalUnlock(hGlobal);
::GlobalFree(hGlobal);
delete[]pbmpinfo;
return TRUE;
}