www.pudn.com > phase_relation.rar > CDIB.CPP, change:2005-05-19,size:4308b


#include "stdafx.h" 
#include "cdib.h" 
#include "windowsx.h" 
 
CDib::CDib(const char* dibFileName) 
{ 
    strcpy(m_fileName, dibFileName); 
    LoadFile(); 
} 
  
CDib::~CDib() 
{ 
    GlobalFreePtr(m_pBitmapInfo); 
} 
 
void CDib::LoadFile() 
{ 
    CFile dibFile(m_fileName, CFile::modeRead); 
     
    BITMAPFILEHEADER bitmapFileHeader; 
    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) // No color table 
			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; 
    } 
} 
 
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; 
} 
 
RGBQUAD* CDib::GetRGB() 
{ 
    return m_pRGB; 
} 
 
BITMAPINFO* CDib::GetInfo() 
{ 
    return m_pBitmapInfo; 
} 
 
 
 
BOOL CDib::SaveBitmapFile(CFile* file) 
{ 
    /* DWORD fileLength = file.GetLength();     
     DWORD bitmapsize = fileLength - 
			sizeof(BITMAPFILEHEADER); 
	 UINT ColorTable=GetNumberOfColors(); 
	 DWORD numberofData=bitmapsize-sizeof(BITMAPINFO)-(DWORD)ColorTable; 
 
	file.Write(m_pBitmapFileHeader, sizeof(BITMAPFILEHEADER)); 
	file.Write(m_pBitmapInfo,sizeof(BITMAPINFO)); 
	file.Write(m_pRGB,ColorTable); 
	file.Write(m_pData,numberofData); 
	file.Close();  */ 
 
 
 
    UINT ColorTable=GetNumberOfColors(); 
    DWORD fileLength = file->GetLength();     
    DWORD bitmapsize = fileLength - 
			sizeof(BITMAPFILEHEADER); 
	//DWORD numberofData=bitmapsize-sizeof(BITMAPINFOHEADER)-(DWORD)ColorTable; 
	DWORD numberofData=bitmapsize-sizeof(BITMAPINFOHEADER)-sizeof(RGBQUAD) *(DWORD)ColorTable; 
 
	BITMAPFILEHEADER bmfh; 
 
	// 设置文件头中文件类型为"BM" 
	bmfh.bfType = 0x4d42;   
 
	// 计算信息头和调色板的大小尺寸 
	int nSizeHdr = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) *(DWORD)ColorTable; 
 
	// 设置文件头信息 
	bmfh.bfSize = sizeof(BITMAPFILEHEADER) + nSizeHdr + numberofData; 
	bmfh.bfReserved1 = bmfh.bfReserved2 = 0; 
	bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 
			sizeof(RGBQUAD) *(DWORD)ColorTable;	 
	 
	// 进行写操作 
	try { 
		file->Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER)); 
		file->Write((LPVOID) m_pBitmapInfo,  nSizeHdr); 
		file->Write((LPVOID) m_pData, numberofData); 
	} 
 
	// 错误处理 
	catch(CException* pe) { 
		pe->Delete(); 
		AfxMessageBox("write error"); 
		return FALSE; 
	} 
 
	// 返回 
	return TRUE; 
}