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;
}