www.pudn.com > sdi-dialog-bmp.rar > DIB.CPP


#include "stdafx.h" 
#include "dib.h" 
#include "windowsx.h" 
#define		WIDTHBYTES(bits)  (((bits)+31)/32*4) 
 
CDib::CDib() 
{ 
 
} 
 
CDib::~CDib() 
{ 
	GlobalFreePtr(m_pBitmapInfo); 
} 
 
void CDib::LoadFile(const char* dibFileName) 
{ 
	strcpy(m_fileName,dibFileName); 
	CFile dibFile; 
    if(!dibFile.Open(m_fileName, CFile::modeRead))    
	{    
          AfxMessageBox("can   not   open   fileŁĄ");  
          return;    
	} 
 
	dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER)); 
 
	if(bitmapFileHeader.bfType == 0x4d42) 
	{ 
		DWORD fileLength = dibFile.GetLength(); 
		DWORD size = fileLength - sizeof (BITMAPFILEHEADER); 
		BYTE* pDib = (BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size); 
		dibFile.Read((void*)pDib, size); 
		dibFile.Close(); 
 
		m_pBitmapInfo = (BITMAPINFO*)pDib; 
		m_pBitmapInfoHeader = (BITMAPINFOHEADER*)pDib; 
		m_pRGB = (RGBQUAD*)(pDib + m_pBitmapInfoHeader->biSize); 
		int m_numberOfColors = GetNumberOfColors(); 
		if (m_pBitmapInfoHeader->biClrUsed == 0) 
		{ 
			m_pBitmapInfoHeader->biClrUsed = m_numberOfColors; 
			DWORD colorTableSize = m_numberOfColors * sizeof(RGBQUAD); 
			m_pData = pDib + m_pBitmapInfoHeader->biSize + colorTableSize; 
			if (m_pRGB == (RGBQUAD*)m_pData) 
				m_pRGB = NULL; 
			m_pBitmapInfoHeader->biSizeImage = GetSize(); 
			m_valid = TRUE; 
		} 
		else  
		{ 
			m_valid = FALSE; 
			AfxMessageBox("This isn't a bitmap file!"); 
		} 
	} 
} 
 
 
	BOOL CDib::IsValid() 
	{ 
		return m_valid; 
	} 
 
	char* CDib::GetFileName() 
	{ 
		return m_fileName; 
	} 
 
	UINT CDib::GetWidth() 
	{ 
		return (UINT) m_pBitmapInfoHeader->biWidth; 
	} 
 
	UINT CDib::GetHeight() 
	{ 
		return (UINT) m_pBitmapInfoHeader->biHeight; 
	} 
 
	DWORD CDib::GetSize() 
	{ 
		if( m_pBitmapInfoHeader->biSizeImage != 0) 
			return m_pBitmapInfoHeader->biSizeImage; 
		else 
		{ 
			DWORD height = (DWORD) GetHeight(); 
			DWORD width = (DWORD) GetWidth(); 
			return height * width; 
		} 
	} 
 
 
	DWORD CDib::GetDibWidthBytes() 
	{ 
		byBitCount = m_pBitmapInfoHeader -> biBitCount; 
		LONG nWidth = m_pBitmapInfoHeader ->biWidth; 
 
		dwWidthBytes = (DWORD)m_pBitmapInfoHeader ->biWidth; 
		if(byBitCount == 1) 
			dwWidthBytes = (nWidth + 7)/8; 
		else if (byBitCount == 4) 
			dwWidthBytes = (nWidth + 1)/2; 
		else if (byBitCount == 24) 
			dwWidthBytes = 3 * nWidth; 
 
		return dwWidthBytes; 
	} 
 
	UINT CDib::GetNumberOfColors() 
	{ 
		int numberOfColors; 
 
		if((m_pBitmapInfoHeader->biClrUsed == 0) && (m_pBitmapInfoHeader->biBitCount < 9)) 
		{ 
			switch (m_pBitmapInfoHeader -> biBitCount) 
			{ 
			   case 1: numberOfColors = 2; break; 
			   case 4: numberOfColors = 16; break; 
			   case 8: numberOfColors = 256;  
			} 
		} 
		else 
			numberOfColors = (int)m_pBitmapInfoHeader ->biClrUsed; 
		return numberOfColors; 
	} 
 
 
	BYTE* CDib::GetData() 
	{ 
		return m_pData; 
	} 
 
	BYTE* CDib::GetData2() 
	{ 
		if(GetRGB()) 
			m_pData2 = m_pData; 
		return m_pData; 
	} 
 
	RGBQUAD* CDib::GetRGB() 
	{ 
		return m_pRGB; 
	} 
 
	BITMAPINFO* CDib::GetInfo() 
	{ 
		return m_pBitmapInfo; 
	} 
 
	WORD CDib::PaletteSize(LPBYTE lpDIB) 
	{ 
		return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE)); 
	} 
      
	WORD CDib::DIBNumColors(LPBYTE lpDIB) 
	{ 
		WORD wBitCount; 
		wBitCount = ((LPBITMAPCOREHEADER)lpDIB) -> bcBitCount; 
		switch (wBitCount) 
		{ 
		case 1: 
			return 2; 
		case 4: 
			return 16; 
		case 16: 
			return 256; 
		default: 
			return 0; 
		} 
	} 
 
	void CDib::SaveFile(const CString filename) 
	{ 
		BITMAPFILEHEADER bmfHdr; 
		LPBITMAPINFOHEADER lpBI; 
		DWORD dwDIBSize; 
 
 
		bmfHdr.bfType = 0x4d42; 
		lpBI = (LPBITMAPINFOHEADER)m_pBitmapInfoHeader; 
		dwDIBSize = * (LPDWORD)lpBI + PaletteSize((LPBYTE)lpBI); 
		if((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4)) 
			dwDIBSize += lpBI->biSizeImage; 
		else 
		{ 
			DWORD dwBmBitsSize; 
			dwBmBitsSize =	WIDTHBYTES((lpBI ->biWidth) * ((DWORD)lpBI ->biBitCount)) * lpBI->biHeight; 
			dwDIBSize += dwBmBitsSize; 
			lpBI->biSizeImage = dwBmBitsSize; 
		} 
		bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER); 
		bmfHdr.bfReserved1 = 0; 
		bmfHdr.bfReserved2 = 0; 
		bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +lpBI->biSize + PaletteSize((LPBYTE)lpBI); 
 
		CFile dibFile(filename, CFile::modeWrite|CFile::modeCreate); 
		dibFile.Write(&bmfHdr, sizeof(BITMAPFILEHEADER)); 
		dibFile.WriteHuge(lpBI, dwDIBSize); 
		dibFile.Close(); 
	} 
 
	void CDib::RGBtoGrade() 
	{ 
		if(GetRGB()) 
			m_pData = m_pData; 
		else 
		{ 
			BYTE r,g,b; 
			int height,wide,size; 
			height = GetHeight(); 
			wide = GetWidth(); 
			size = height * wide; 
			m_pData2 = (BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size); 
			LONG lLineBytes = GetDibWidthBytes(); 
			for (int j= 0;j