www.pudn.com > bmpstudy.rar > dib.cpp


#include "stdafx.h" 
#include "dib.h" 
#include "windowsx.h" 
//构造函数 
CDib::CDib() 
{ 
	m_valid = false; 
	Size = 0; 
} 
//析构函数 
CDib::~CDib() 
{ 
	GlobalFree(m_pBitmapInfo); 
} 
 
//载入文件 
void CDib::LoadFile(const char *dibFileName) 
{ 
	strcpy(m_fileName,dibFileName); 
	CFile dibFile; 
	HANDLE hDib; 
	dibFile.Open(m_fileName,CFile::modeRead); 
	dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER)); 
//	dibFile.Close(); 
 
	if(bitmapFileHeader.bfType==0x4d42) 
	{ 
		DWORD fileLength = dibFile.GetLength(); 
		Size = fileLength-sizeof(BITMAPFILEHEADER); 
		//pDib = new BYTE[Size]; 
		hDib = GlobalAlloc(GMEM_MOVEABLE,Size);////////*********pDib = (BYTE*)GlobalAlloc(GMEM_MOVEABLE,Size); 
 
		if(!hDib)//////////**********上面做法是错的 
		{		 
			AfxMessageBox("分配空间出错!"); 
			return; 
		} 
 
		pDib = (BYTE*)GlobalLock(hDib); 
		 
		if(!pDib) 
		{ 
			GlobalFree(hDib); 
			return; 
		} 
 
		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 
		AfxMessageBox("不是位图!"); 
 
	GlobalUnlock(hDib); 
} 
 
//返回图像颜色数 
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;break; 
		} 
	} 
	else 
		numberOfColors = (int)m_pBitmapInfoHeader->biClrUsed; 
	return numberOfColors; 
} 
 
//返回图像的大小 
DWORD CDib::GetSize() 
{ 
	if(m_pBitmapInfoHeader->biSizeImage!=0) 
	{ 
 
		return m_pBitmapInfoHeader->biSizeImage; 
	} 
 
	else 
	{ 
 
		DWORD height = (DWORD)GetHeight(); 
		DWORD width = (DWORD)GetWidth(); 
		return height*width; 
 
	} 
} 
 
//返回图像的宽 
UINT CDib::GetWidth() 
{ 
	return (UINT)m_pBitmapInfoHeader->biWidth; 
} 
 
//返回图像的高 
UINT CDib::GetHeight() 
{ 
	return (UINT)m_pBitmapInfoHeader->biHeight; 
} 
 
//是否载入了图像 
BOOL CDib::IsValid() 
{ 
	return m_valid; 
} 
 
//返回文件的名字 
char* CDib::GetFileName() 
{ 
	return m_fileName; 
} 
 
//返回图像的数据指针 
BYTE* CDib::GetData() 
{ 
	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));//RGBTRIPLE 
} 
 
/////////////////////////////////// 
WORD CDib::DIBNumColors(LPBYTE lpDIB) 
{ 
	WORD wBitCount; 
	wBitCount = ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;//LPBITMAPCOREHEADER 
	switch(wBitCount) 
	{ 
	case 1: 
		return 2; 
	case 4: 
		return 16; 
	case 8: 
		return 256; 
	default: 
		return 0; 
	} 
} 
 
void CDib::SaveFile(const char *dibFileName) 
{ 
	//此函数只能保存经处理后宽度和高度都没有发生改变大小的图像 
	strcpy(m_fileName,dibFileName); 
	CFile dibFile(m_fileName,CFile::modeCreate|CFile::modeWrite); 
	dibFile.Write((void*)pDib,Size); 
	dibFile.Close(); 
}