www.pudn.com > expressionsb.rar > DIB.cpp


// DIB.cpp: implementation of the CDIB class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "test1.h" 
#include "DIB.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CDIB::CDIB() 
{ 
	m_hDIB=NULL; 
	m_sizeDIB=CSize(0,0); 
	m_pPal=NULL; 
} 
 
CDIB::~CDIB() 
{ 
	if(m_hDIB!=NULL)//删除存储图像的区域 
		::GlobalFree((HGLOBAL)m_hDIB); 
	if(m_pPal!=NULL) 
		delete m_pPal; 
} 
 
CDIB::CDIB(LPCTSTR lpPathName) 
{ 
 
	m_hDIB=CreateDIB(lpPathName); 
	if(m_hDIB==NULL) 
	{ 
		MessageBox(NULL,"构造DIB类失败!",NULL,MB_OK); 
		m_sizeDIB=CSize(0,0); 
		m_pPal=NULL; 
	} 
	else 
	{ 
		LPSTR _lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB); 
		m_sizeDIB=GetDIBSize(_lpDIB); 
		::GlobalUnlock((HGLOBAL)m_hDIB); 
		m_pPal=new CPalette; 
		if(!CreateDIBPalette(m_hDIB,m_pPal)) 
		{delete m_pPal; m_pPal=NULL;} 
	} 
} 
 
HDIB CDIB::ReadDIBFile(CFile& file) 
{ 
	BITMAPFILEHEADER bmfHeader; 
	DWORD dwBitsSize; 
	HDIB hDIB; 
	LPSTR pDIB; 
	dwBitsSize=file.GetLength(); 
	if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader)) 
	{return NULL;} 
    if(bmfHeader.bfType!=DIB_HEADER_MARKER) 
	{return NULL;} 
	hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize-sizeof(BITMAPFILEHEADER)); 
	if(hDIB==0) 
		return NULL; 
	pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB); 
	if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER)) 
	{ 
		::GlobalUnlock((HGLOBAL)hDIB); 
		::GlobalFree((HGLOBAL)hDIB); 
		return NULL; 
	} 
	::GlobalUnlock((HGLOBAL)hDIB); 
	return hDIB; 
} 
 
HDIB CDIB::CreateDIB(LPCTSTR lpPathName) 
{ 
	HDIB _hDIB; 
	CFile file; 
	CFileException fe; 
	if(!file.Open(lpPathName,CFile::modeRead|CFile::shareDenyWrite,&fe)) 
	{ 
	//	ReportSaveLoadException(lpPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); 
		//_hDIB=NULL; 
		return NULL; 
	} 
	TRY{ 
		_hDIB=ReadDIBFile(file); 
	} 
	CATCH(CFileException,eLoad) 
	{ 
		file.Abort(); 
		_hDIB=NULL; 
	//	return ; 
	} 
	END_CATCH 
	return _hDIB; 
} 
 
CSize CDIB::GetDIBSize(LPSTR lpDIB)//返回图像尺寸,而不是实际存储尺寸 
{ 
	LPBITMAPINFOHEADER lpbmi; 
	LPBITMAPCOREHEADER lpbmc; 
	lpbmi=(LPBITMAPINFOHEADER)lpDIB; 
	lpbmc=(LPBITMAPCOREHEADER)lpDIB; 
	if(IS_WIN30_DIB(lpDIB)) 
	{ 
		return CSize((int)lpbmi->biWidth,(int)lpbmi->biHeight);	 
	} 
	else 
	{ 
		return CSize((int)lpbmc->bcWidth,(int)lpbmc->bcHeight); 
	} 
} 
 
WORD CDIB::NumColors(LPSTR lpbi) 
{ 
	WORD wBitCount; 
	WORD wNumCol; 
	if(IS_WIN30_DIB(lpbi)) 
	{ 
		DWORD dwClrUsed; 
		dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed; 
		if(dwClrUsed!=0) 
			return (WORD)dwClrUsed; 
	} 
 
		if(IS_WIN30_DIB(lpbi)) 
			wBitCount=((LPBITMAPINFOHEADER)lpbi)->biBitCount; 
		else 
			wBitCount=((LPBITMAPCOREHEADER)lpbi)->bcBitCount; 
		switch(wBitCount) 
		{ 
		case 1: 
			wNumCol=2; 
			break; 
		case 4: 
			wNumCol=16; 
			break; 
		case 8: 
			wNumCol=256; 
			break; 
		default: 
			wNumCol=0;		 
		} 
		return wNumCol; 
} 
 
BOOL CDIB::CreateDIBPalette(HDIB hDIB, CPalette *cPal) 
{ 
	LPLOGPALETTE lpPal;//指针,指向逻辑调色板 
	HANDLE hLogPal;//调色板句柄 
	int i; 
	WORD wNumColors; 
	LPSTR lpbi;//DIB指针 
	LPBITMAPINFO lpbmi;//BITMAPINFO结构指针,书中好像没有介绍这个结构,可以直接把DIB对象的指针赋给它 
	LPBITMAPCOREINFO lpbmc; 
	BOOL bResult=FALSE; 
	if(hDIB==NULL) 
		return FALSE; 
	lpbi=(LPSTR)::GlobalLock((HGLOBAL)hDIB); 
	lpbmi=(LPBITMAPINFO)lpbi; 
	lpbmc=(LPBITMAPCOREINFO)lpbi; 
	wNumColors=NumColors(lpbi); 
	if(wNumColors!=0){ 
		hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors); 
		if(hLogPal==0) 
		{ 
			::GlobalUnlock((HGLOBAL)hDIB); 
			return FALSE;		 
		} 
		lpPal=(LPLOGPALETTE)::GlobalLock((HGLOBAL)hLogPal); 
		lpPal->palVersion=PALVERSION; 
		lpPal->palNumEntries=(WORD)wNumColors; 
		if(IS_WIN30_DIB(lpbi)){ 
			for(i=0;i<(int)wNumColors;i++){ 
				lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed; 
				lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen; 
				lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue; 
				lpPal->palPalEntry[i].peFlags=0;			 
			} 
		} 
		else{ 
			for(i=0;i<(int)wNumColors;i++){ 
				lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed; 
				lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen; 
				lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue; 
				lpPal->palPalEntry[i].peFlags=0;			 
			} 
		}//end else 
		bResult=cPal->CreatePalette(lpPal); 
		::GlobalUnlock((HGLOBAL)hLogPal); 
		::GlobalFree((HGLOBAL)hLogPal); 
	} 
	::GlobalUnlock((HGLOBAL)hDIB); 
	return bResult; 
} 
 
HDIB CDIB::GetHDIB() const 
{ 
	return m_hDIB; 
} 
 
BOOL CDIB::PaintDIB(HDC hDC, LPRECT lpDCRect) 
{ 
 CRect rcDIB; 
 rcDIB.left=0; rcDIB.top=0; rcDIB.right=m_sizeDIB.cx; rcDIB.bottom=m_sizeDIB.cy; 
 BOOL bSuccess=FALSE; 
 LPSTR lpDIBHdr; //信息头 
 LPSTR lpDIBBits; //图像起始位置 
 HPALETTE hPal=NULL;//DIB调色板句柄 
 HPALETTE hOldPal=NULL; 
 if(m_hDIB==NULL) 
	 return FALSE; 
 lpDIBHdr=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB); 
 lpDIBBits=FindDIBBits(lpDIBHdr); 
 if(m_pPal!=NULL) 
 { 
	 hPal=(HPALETTE)m_pPal->m_hObject; 
	 hOldPal=::SelectPalette(hDC,hPal,TRUE);//全局函数(API),将当前环境hDC赋予新的调色板,并返回以前的调色板  
 } 
 ::SetStretchBltMode(hDC,COLORONCOLOR);//(API) 
 if((RECTWIDTH(lpDCRect)==m_sizeDIB.cx)&&(RECTHEIGHT(lpDCRect)==m_sizeDIB.cy))//目标区域和源区域相同,调用全局函数SetDIBitsToDevice 
	 bSuccess=::SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),rcDIB.left,rcDIB.top,0,m_sizeDIB.cy,lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS); 
 else //目标区域与源区域不同时,进行缩放,调用全局函数StretchDIBits 
	 bSuccess=::StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),rcDIB.left,rcDIB.top,m_sizeDIB.cx,m_sizeDIB.cy,lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY); 
 ::GlobalUnlock((HGLOBAL)m_hDIB); 
 if(hOldPal!=NULL) 
	 ::SelectPalette(hDC,hOldPal,TRUE); 
  
 return bSuccess; 
} 
 
//计算DIB对象的象素的起始位置,并返回其指针 
LPSTR CDIB::FindDIBBits(LPSTR lpbi) 
{ 
	return (lpbi+*(LPWORD)lpbi+PaletteSize(lpbi));//*(LPWORD)lpbi为信息头的一个元素,即biSize,表示本信息头的长度 
} 
 
WORD CDIB::PaletteSize(LPSTR lpbi) 
{ 
	if(IS_WIN30_DIB(lpbi)){ 
		return (WORD)(NumColors(lpbi)*sizeof(RGBQUAD)); 
	} 
	else{ 
		return (WORD)(NumColors(lpbi)*sizeof(RGBTRIPLE)); 
	} 
} 
 
CSize CDIB::GetDIBSize() 
{ 
	return m_sizeDIB; 
} 
 
//根据pDIB及其中的一个子区域构造一个子图像类 
CDIB::CDIB(CDIB* pDIB, int _left, int _top, int _right, int _bottom) 
{ 
	int _width,_height,i,j,m,n; 
	_width=_right-_left; 
	_height=_bottom-_top; 
	int _widthBytes=WIDTHBYTES(8*_width); 
	int srcWidth=pDIB->GetDIBSize().cx; 
	int srcHeight=pDIB->GetDIBSize().cy; 
	int srcwidthBytes=WIDTHBYTES(8*srcWidth); 
	LPSTR lpbi,destLpbi; 
	unsigned char* destImage, * srcImage; 
	LPBITMAPINFOHEADER lpbmi,destLpbmi; 
	HDIB _hDIB; 
 
	if(!((_left>=0)&&(_right<=srcWidth)&&(_top>=0)&&(_bottom<=srcHeight))) 
	{ 
		MessageBox(NULL,"子图像的边界定义出错!",NULL,MB_OK); 
		SetEmpty(); 
		return; 
	} 
 
	_hDIB=pDIB->GetHDIB(); 
	lpbi=(LPSTR)::GlobalLock((HGLOBAL)_hDIB); 
	if(NumColors(lpbi)!=256)//仅支持对256色位图提取子位图 
	{ 
		MessageBox(NULL,"仅支持256位图!",NULL,MB_OK); 
		::GlobalUnlock((HGLOBAL)_hDIB); 
		SetEmpty(); 
		return; 
	} 
	if(!IS_WIN30_DIB(lpbi)) 
	{ 
		MessageBox(NULL,"仅支持WIN30位图!",NULL,MB_OK); 
		::GlobalUnlock((HGLOBAL)_hDIB); 
		SetEmpty(); 
		return; 
	} 
	WORD _paletteSize=pDIB->PaletteSize(lpbi); 
//	m_hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(BITMAPINFOHEADER)+_paletteSize+_widthBytes*_height); 
	m_hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,*(LPWORD)lpbi+_paletteSize+_widthBytes*_height); 
	if(m_hDIB==NULL) 
	{ 
		::GlobalUnlock((HGLOBAL)_hDIB); 
		SetEmpty(); 
		return; 
	} 
	destLpbi=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB); 
	::memcpy(destLpbi,lpbi,sizeof(BITMAPINFOHEADER)+_paletteSize); 
	destLpbmi=(LPBITMAPINFOHEADER)destLpbi; 
	lpbmi=(LPBITMAPINFOHEADER)lpbi; 
	destLpbmi->biBitCount=8; 
	destLpbmi->biClrUsed=256; 
	destLpbmi->biHeight=_height; 
	destLpbmi->biWidth=_width; 
	destLpbmi->biSizeImage=_widthBytes*_height; 
	destImage=(unsigned char*)FindDIBBits(destLpbi); 
	srcImage=(unsigned char*)FindDIBBits(lpbi); 
	for(j=_top,n=_height-1;j<_bottom;j++,n--) 
		for(i=_left,m=0;i<_right;i++,m++) 
		{ 
			*(destImage+n*_widthBytes+m)=*(srcImage+(srcHeight-j-1)*srcwidthBytes+i); 
		} 
	::GlobalUnlock((HGLOBAL)_hDIB); 
	::GlobalUnlock((HGLOBAL)m_hDIB); 
	//m_sizeDIB.cx=_widthBytes; 
	m_sizeDIB.cx=_width; 
	m_sizeDIB.cy=_height; 
	m_pPal=new CPalette; 
	if(!CreateDIBPalette(m_hDIB,m_pPal)) 
	{delete m_pPal; m_pPal=NULL;} 
} 
 
/** 
* 该函数以pDIB为模板,以Gabor的模pGabor为内容,建立一个新的 
* DIB文件,新文件的长宽分别为原图像的1/5 
* _changePal标记为是否改变调色板 
*/ 
CDIB::CDIB(CDIB* pDIB,FLOAT *pGabor, CSize _size, BOOL _changePal) 
{ 
	int _width,_height,i,m,n; 
	_width=_size.cx; 
	_height=_size.cy; 
	int _widthBytes=WIDTHBYTES(8*_width); 
	int srcWidth=pDIB->GetDIBSize().cx; 
	int srcHeight=pDIB->GetDIBSize().cy; 
	int srcwidthBytes=WIDTHBYTES(8*srcWidth); 
	LPSTR lpbi,destLpbi; 
	unsigned char* destImage, * srcImage; 
	LPBITMAPINFOHEADER lpbmi,destLpbmi; 
	HDIB _hDIB; 
 
	if(pGabor==NULL) 
		return; 
	_hDIB=pDIB->GetHDIB(); 
	lpbi=(LPSTR)::GlobalLock((HGLOBAL)_hDIB); 
	if(NumColors(lpbi)!=256)//仅支持对256色位图提取子位图 
	{ 
		MessageBox(NULL,"仅支持256位图!",NULL,MB_OK); 
		::GlobalUnlock((HGLOBAL)_hDIB); 
		SetEmpty(); 
		return; 
	} 
	if(!IS_WIN30_DIB(lpbi)) 
	{ 
		MessageBox(NULL,"仅支持WIN30位图!",NULL,MB_OK); 
		::GlobalUnlock((HGLOBAL)_hDIB); 
		SetEmpty(); 
		return; 
	} 
	WORD _paletteSize=pDIB->PaletteSize(lpbi); 
//	m_hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(BITMAPINFOHEADER)+_paletteSize+_widthBytes*_height); 
	m_hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,*(LPWORD)lpbi+_paletteSize+_widthBytes*_height); 
	if(m_hDIB==NULL) 
	{ 
		::GlobalUnlock((HGLOBAL)_hDIB); 
		SetEmpty(); 
		return; 
	} 
	destLpbi=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB); 
	::memcpy(destLpbi,lpbi,sizeof(BITMAPINFOHEADER)+_paletteSize); 
	destLpbmi=(LPBITMAPINFOHEADER)destLpbi; 
	lpbmi=(LPBITMAPINFOHEADER)lpbi; 
	destLpbmi->biBitCount=8; 
	destLpbmi->biClrUsed=256; 
	destLpbmi->biHeight=_height; 
	destLpbmi->biWidth=_width; 
	destLpbmi->biSizeImage=_widthBytes*_height; 
	destImage=(unsigned char*)FindDIBBits(destLpbi); 
	srcImage=(unsigned char*)FindDIBBits(lpbi); 
	 
	FLOAT _max=0.0f; 
	FLOAT _min, _scope; 
	for(i=0;i<_width*_height;i++) 
		_max=(_max>pGabor[i])?_max:pGabor[i]; 
	_min=_max; 
	for(i=0;i<_width*_height;i++) 
		_min=(_minbmiColors[i].rgbBlue=(BYTE)i; 
				lpbmi->bmiColors[i].rgbGreen=(BYTE)i; 
				lpbmi->bmiColors[i].rgbRed=(BYTE)i; 
				lpbmi->bmiColors[i].rgbReserved=0; 
			} 
		} 
		else 
		{ 
			for(i=0;i<(int)wNumColors;i++) 
			{ 
				lpbmc->bmciColors[i].rgbtBlue=(BYTE)i; 
				lpbmc->bmciColors[i].rgbtGreen=(BYTE)i; 
				lpbmc->bmciColors[i].rgbtRed=(BYTE)i; 
			}		 
		} 
	} 
////////////////// 
	::GlobalUnlock((HGLOBAL)_hDIB); 
	::GlobalUnlock((HGLOBAL)m_hDIB); 
	//m_sizeDIB.cx=_widthBytes; 
	m_sizeDIB.cx=_width; 
	m_sizeDIB.cy=_height; 
	m_pPal=new CPalette; 
	if(!CreateDIBPalette(m_hDIB,m_pPal)) 
	{delete m_pPal; m_pPal=NULL;} 
} 
 
void CDIB::SetEmpty() 
{ 
		m_hDIB=NULL; 
		m_pPal=NULL; 
		m_sizeDIB=CSize(0,0); 
} 
 
BOOL CDIB::SaveDIB(LPCTSTR lpszPathName) 
{ 
	CFile file; 
	CFileException fe; 
	if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe)) 
	{ 
	//	ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_INVALID_FILENAME); 
		return FALSE;	 
	} 
	BOOL bSuccess=FALSE; 
	TRY{ 
//		BeginWaitCursor(); 
		bSuccess=SaveDIB(m_hDIB,file); 
		file.Close(); 
	} 
	CATCH(CException,eSave){ 
		file.Abort(); 
//		EndWaitCursor(); 
//		ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC); 
		return FALSE; 
	} 
	END_CATCH 
 
//	EndWaitCursor(); 
	if(!bSuccess) 
	{ 
		CString strMsg="无法保存BMP图像"; 
		MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);			 
	} 
	return bSuccess; 
} 
 
BOOL CDIB::SaveDIB(HDIB hDib, CFile &file) 
{ 
	BITMAPFILEHEADER bmfHdr; 
	LPBITMAPINFOHEADER lpBI; 
	DWORD dwDIBSize; 
	if(hDib==NULL) 
		return FALSE; 
	lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib); 
	if(lpBI==NULL) 
		return FALSE; 
	if(!IS_WIN30_DIB(lpBI)) 
	{ 
		::GlobalUnlock((HGLOBAL)hDib); 
		return FALSE; 
	} 
	bmfHdr.bfType=DIB_HEADER_MARKER; 
	//计算文件总大小 
	dwDIBSize=*(LPDWORD)lpBI+PaletteSize((LPSTR)lpBI); 
	if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4)) 
		dwDIBSize+=lpBI->biSizeImage; 
	else{ 
	 
		DWORD dwBmBitsSize; 
		dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight; 
		dwDIBSize+=dwBmBitsSize; 
		lpBI->biSizeImage=dwBmBitsSize; 
	} 
	bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER); 
	bmfHdr.bfReserved1=0; 
	bmfHdr.bfReserved2=0; 
	bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+*(LPDWORD)lpBI+PaletteSize((LPSTR)lpBI); 
	//write: 
	TRY{ 
		file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER)); 
		file.WriteHuge(lpBI,dwDIBSize);	 
	} 
	CATCH(CFileException, e){ 
		::GlobalUnlock((HGLOBAL)hDib); 
		THROW_LAST(); 
	} 
	END_CATCH 
	::GlobalUnlock((HGLOBAL)hDib); 
 
	return TRUE; 
} 
 
BOOL CDIB::ScaleNormal(CSize toSize) 
{//尺寸归一化处理,要求归一化后的尺寸>=10*10 
	if((toSize.cx<10)||(toSize.cy<10)) 
	{ 
		MessageBox(NULL,"归一尺寸必须大于10×10",NULL,MB_OK); 
		return FALSE; 
	} 
	int destWidth,destHeight,srcWidth,srcHeight; 
	destWidth=toSize.cx; 
	destHeight=toSize.cy; 
	srcWidth=this->GetDIBSize().cx; 
	srcHeight=this->GetDIBSize().cy; 
	int srcWidthBytes=WIDTHBYTES(8*srcWidth); 
	int destWidthBytes=WIDTHBYTES(8*destWidth); 
	LPSTR lpbi,destLpbi; 
	LPBITMAPINFO destLpbmi; 
	BYTE *srcImage,*destImage; 
	HDIB tmp_hDIB; 
	lpbi=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB); 
	tmp_hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,*(LPWORD)lpbi+PaletteSize(lpbi)+destWidthBytes*destHeight); 
	if(tmp_hDIB==NULL) 
	{ 
		MessageBox(NULL,"分配内存出错!",NULL,MB_OK); 
		::GlobalUnlock((HGLOBAL)m_hDIB); 
		return FALSE; 
	} 
	destLpbi=(LPSTR)::GlobalLock((HGLOBAL)tmp_hDIB); 
	::memcpy(destLpbi,lpbi,*(LPWORD)lpbi+PaletteSize(lpbi)); 
	destLpbmi=(LPBITMAPINFO)destLpbi; 
	destLpbmi->bmiHeader.biHeight=destHeight;//归一后的图像高 
	destLpbmi->bmiHeader.biWidth=destWidth;//归一后的图像宽 
	destLpbmi->bmiHeader.biSizeImage=destWidthBytes*destHeight;//图像的实际存储大小 
	srcImage=(BYTE*)FindDIBBits(lpbi); 
	destImage=(BYTE*)FindDIBBits(destLpbi); 
	/////////双线性插值进行尺寸归一化处理 
	FLOAT sx,sy;//缩放的比例因子 
	sx=((FLOAT)srcWidth)/destWidth; 
	sy=((FLOAT)srcHeight)/destHeight; 
	//BYTE I_00,I_01,I_10,I_11,I_tmp1,I_tmp2;//采用双线性插值时对应的四个点的灰度值 
	int x0,y0,x1,y1;//采用双线性插值时对应的四个点的坐标值 
	int i,j;//循环因子 
 
	for(i=0;i=srcWidth) x1=srcWidth-1; 
			if(y1>=srcHeight) y1=srcHeight-1; 
			/** 
				当采用双线性插值时(下面被注释掉的部分),虽然从理论上可行 
				但显示效果并不好,故使用下面一行代码来替换,该方法就是简单的进行像素替换 
			*/ 
			*(destImage+i*destWidthBytes+j)=*(srcImage+y0*srcWidthBytes+x0); 
			/*I_00=*(srcImage+y0*srcWidthBytes+x0); 
			I_01=*(srcImage+y0*srcWidthBytes+x1); 
			I_10=*(srcImage+y1*srcWidthBytes+x0); 
			I_11=*(srcImage+y1*srcWidthBytes+x1); 
			I_tmp1=I_00+(BYTE)((sx*j-x0)*(int)(I_01-I_00)); 
			I_tmp2=I_10+(BYTE)((sx*j-x0)*(int)(I_11-I_10)); 
			*(destImage+i*destWidthBytes+j)=I_tmp1+(BYTE)((sy*i-y0)*(int)(I_tmp2-I_tmp1)); 
		/////////////////////以下代码不用 
			if(I_01>I_00) 
				I_tmp1=I_00+(BYTE)((sx*j-x0)*(I_01-I_00)); 
			else 
				I_tmp1=I_01+(BYTE)((x1-sx*j)*(I_00-I_01)); 
			if(I_11>I_10) 
				I_tmp2=I_10+(BYTE)((sx*j-x0)*(I_11-I_10)); 
			else 
				I_tmp2=I_11+(BYTE)((x1-sx*j)*(I_10-I_11)); 
			if(I_tmp2>I_tmp1) 
				*(destImage+i*destWidthBytes+j)=I_tmp1+(BYTE)((sy*i-y0)*(I_tmp2-I_tmp1)); 
			else 
				*(destImage+i*destWidthBytes+j)=I_tmp2+(BYTE)((y1-sy*i)*(I_tmp1-I_tmp2)); 
	  //////////////////////////////////////////////////////////// 
			*/		 
		} 
		::GlobalUnlock((HGLOBAL)m_hDIB); 
		::GlobalUnlock((HGLOBAL)tmp_hDIB); 
		::GlobalFree((HGLOBAL)m_hDIB); 
		m_hDIB=tmp_hDIB; 
		m_sizeDIB=CSize(destWidth,destHeight); 
	return TRUE; 
}