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