// scBmp.cpp: implementation of the scBmp class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "scBmp.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
scBmp::scBmp()
{
this->m_bmpSize.bmpHeight=0;
this->m_bmpSize.bmpWidth=0;
this->m_bmpSize.BitCount=0;
this->m_bmpSize.BytesPerLine=0;
}
scBmp::~scBmp()
{
}
bool scBmp::Read(const char *FileName)
{
fstream file;
file.open(FileName,ios::binary | ios::in | ios::nocreate);
if(file.fail())
{
file.close();
return false;
}
// 尝试读取DIB文件头
file.read((char*)&m_bmfHeader,sizeof(BITMAPFILEHEADER));
// 判断是否是DIB对象,检查头两个字节是否是"BM"
if(m_bmfHeader.bfType!=0x4d42)
{
file.close();
return false;
}
BITMAPINFOHEADER bi;
file.read((char *)&bi,sizeof(BITMAPINFOHEADER));
bi.biSizeImage=m_bmfHeader.bfSize-m_bmfHeader.bfOffBits;//像素数据占用的字节数
int numQuad=0;
if(bi.biBitCount<24)
{
numQuad=1<<bi.biBitCount;
}
// m_pbi=(BITMAPINFO*)new char[m_bmfHeader.bfOffBits-sizeof(BITMAPFILEHEADER)];
if(!m_pbi.New(0,m_bmfHeader.bfOffBits-sizeof(BITMAPFILEHEADER)))
return false;
memcpy(m_pbi.GetDataPointer(),&bi,sizeof(BITMAPINFOHEADER));
if(numQuad!=0)
{
RGBQUAD* quad=(RGBQUAD*)(m_pbi.GetDataPointer()+sizeof(BITMAPINFOHEADER));//调色板指针(若有的话)
file.read((char *)quad,sizeof(RGBQUAD)*numQuad);
}
m_bmpSize.bmpHeight=bi.biHeight;
m_bmpSize.bmpWidth=bi.biWidth;
m_bmpSize.BitCount=bi.biBitCount;
m_bmpSize.BytesPerLine=WIDTHBYTES(m_bmpSize.bmpWidth*m_bmpSize.BitCount);
// if(!this->New(m_bmpSize.bmpHeight,m_bmpSize.BytesPerLine))//Rows??Cols???
if(!this->m_pixels.New(0,bi.biSizeImage))//Rows??Cols???????????
{//////////////////////////////////?bi.biSizeImage!=bmpHeight*BytesPerLine?????
////////////////////////注意:彩色图像biSizeImage=2+bmpHeight*BytesPerLine
////////////////////////注意:灰度图像biSizeImage=bmpHeight*BytesPerLine
// 内存分配失败,返回NULL。
return false;
}
file.read(m_pixels.GetDataPointer(), bi.biSizeImage);
file.close();
this->m_pFileName=FileName;
return true;
}
bool scBmp::Write(const char *FileName)
{
if(this->m_bmpSize.bmpHeight==0 || this->m_bmpSize.bmpWidth==0)
return false;
fstream file;
file.open((FileName),ios::binary | ios::out);
if(file.fail())
{
file.close();
return false;
}
file.write((char *)&this->GetBmpFileHeader(),sizeof(BITMAPFILEHEADER));
file.write((char *)this->GetBmpInfo(),this->GetBmpFileHeader().bfOffBits-sizeof(BITMAPFILEHEADER));
file.write((char *)this->GetPixels()->GetDataPointer(),this->GetBmpInfo()->bmiHeader.biSizeImage);
file.close();
this->m_pFileName=FileName;
return true;
}
void scBmp::Display(HDC hdc,int XDest,int YDest)
{
if( this->m_pixels.GetLength()==0 || hdc==NULL) return;
SetDIBitsToDevice(hdc,
XDest,
YDest,
this->m_bmpSize.bmpWidth,
this->m_bmpSize.bmpHeight,
0,
0,
0,
m_bmpSize.bmpHeight,
this->GetPixels()->GetDataPointer(),
this->GetBmpInfo(),
DIB_RGB_COLORS);
}
//void scBmp::MakeDIB(HANDLE hDib)
HANDLE scBmp::MakeDIB()
{
HANDLE hDib=NULL;
hDib=::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,m_pbi.GetLength()+m_pixels.GetLength());
char * pDest=(char *)::GlobalLock(HGLOBAL(hDib));
memcpy(pDest,m_pbi.GetDataPointer(),m_pbi.GetLength());
memcpy(pDest+m_pbi.GetLength(),m_pixels.GetDataPointer(),m_pixels.GetLength());
::GlobalUnlock((HGLOBAL)hDib);
//不用释放,系统会管理该内存
return hDib;
}
bool scBmp::CopyDIB(HANDLE hDib)
{
if(hDib==NULL)
return false;
BITMAPINFOHEADER bi;
char *pSrc=(char *)::GlobalLock((HGLOBAL)hDib);
memcpy(&bi,pSrc,sizeof(BITMAPINFOHEADER));
pSrc+=sizeof(BITMAPINFOHEADER);
long BytesPerLine=WIDTHBYTES(bi.biWidth*bi.biBitCount);
bi.biSizeImage=BytesPerLine*bi.biHeight;
/*
if(bi.biBitCount==24)
bi.biSizeImage+=2;
*/
int numQuad=0;
if(bi.biBitCount<24)
{
numQuad=1<<bi.biBitCount;
}
if(!m_pbi.New(0,sizeof(RGBQUAD)*numQuad+sizeof(BITMAPINFOHEADER)))
return false;
memcpy(m_pbi.GetDataPointer(),&bi,sizeof(BITMAPINFOHEADER));
if(numQuad!=0)
{
RGBQUAD* quad=(RGBQUAD*)(m_pbi.GetDataPointer()+sizeof(BITMAPINFOHEADER));//调色板指针(若有的话)
memcpy(quad,pSrc,sizeof(RGBQUAD)*numQuad);
pSrc+=sizeof(RGBQUAD)*numQuad;
}
m_bmpSize.bmpHeight=bi.biHeight;
m_bmpSize.bmpWidth=bi.biWidth;
m_bmpSize.BitCount=bi.biBitCount;
m_bmpSize.BytesPerLine=BytesPerLine;
//WIDTHBYTES(m_bmpSize.bmpWidth*m_bmpSize.BitCount);
if(!this->m_pixels.New(0,bi.biSizeImage))//Rows??Cols???????????
{//////////////////////////////////?bi.biSizeImage!=bmpHeight*BytesPerLine?????
////////////////////////注意:彩色图像biSizeImage=2+bmpHeight*BytesPerLine
////////////////////////注意:灰度图像biSizeImage=bmpHeight*BytesPerLine
// 内存分配失败,返回NULL。
return false;
}
memcpy(this->m_pixels.GetDataPointer(),pSrc,bi.biSizeImage);
::GlobalUnlock((HGLOBAL)hDib);
// ::GlobalFree((HGLOBAL)hDib);
m_bmfHeader.bfType=0x4d42;
m_bmfHeader.bfReserved1=0;
m_bmfHeader.bfReserved2=0;
m_bmfHeader.bfSize=sizeof(BITMAPFILEHEADER)+m_pbi.GetLength()
+m_pixels.GetLength();
m_bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+m_pbi.GetLength();
return true;
}
- 1
- 2
- 3
- 4
前往页