#include "stdafx.h"
#include "CDib.h"
#include "WINDOWSX.H"
CDib::CDib()
{
size=0;
}
CDib::~CDib()
{
GlobalFreePtr(m_pBitmapInfo);
}
void CDib::LoadFile(const char * dibFileName)
{
strcpy(m_fileName,dibFileName);
CFile dibFile(m_fileName,CFile::modeRead);
dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
if(bitmapFileHeader.bfType==0x4d42)
{
DWORD fileLength=dibFile.GetLength();
size=fileLength-sizeof(BITMAPFILEHEADER);
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 isnit abitmap 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;
}
//GetSize()返回图像的面积大小
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 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;
}
WORD CDib::PaletteSize(LPBYTE lpDIB)
{
return(DIBNumColors(lpDIB)*sizeof(RGBTRIPLE));
}
WORD CDib::DIBNumColors(LPBYTE lpDIB)
{
WORD wBitCount; //DIB bit count
wBitCount=((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
switch(wBitCount)
{
case 1:return 2;
case 4:return 16;
case 8:return 256;
default:return 0;
}
}
void CDib::SaveFile(const CString filename)
{
strcpy(m_fileName,filename);
CFile dibFile(m_fileName,CFile::modeCreate|CFile::modeWrite);
dibFile.Write((void *)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.Write((void *)pDib,size);
dibFile.Close();
}
评论0