logo资料库

bmp图像读取源代码.doc

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
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; }
分享到:
收藏