www.pudn.com > mySnake-2.rar > LoadBmpFile.cpp


#include "stdafx.h" 
#include "LoadBmpFile.h" 
#include "math.h" 
///////////////////////////////////////////////////////loadBmp 
BOOL load_bmp_file::LoadBmpFile (HWND hWnd,const char *BmpFileName) 
{ 
	DWORD ImgSize; 
	HDC hDc; 
	 
	HFILE hf; 
 
	LPBITMAPINFOHEADER lpImgData; 
 
	HLOCAL  hPal; //存储调色板的局部内存句柄 
 
	LOGPALETTE  *pPal; //指向逻辑调色板结构的指针 
 
	LPRGBQUAD   lpRGB; //指向RGBQUAD结构的指针 
 
	HPALETTE    hPrevPalette; //用来保存设备中原来的调色板 
 
	if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR ) 
	{ 
		MessageBox(hWnd,BmpFileName,"Open File Error!",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE; 
	} 
 
     //读bf 
 	_lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); 
	 //读bi 
	_lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER)); 
 
	bi.biSizeImage=	ImgSize = (DWORD)WIDTHBYTES(bi.biBitCount*bi.biWidth)*bi.biHeight; 
 
 
 
	////////颜色数量的确定 
	if(bi.biClrUsed==0)  //bi.biClrUsed即为实际用到的颜色数 
	{ 
		switch(bi.biBitCount) 
		{ 
		case 1: 
			NumColors=2; 
			break; 
		case 4: 
			NumColors=16; 
			break; 
		case 8: 
			NumColors=256; 
			break; 
		case 24: 
			NumColors=0; 
			break; 
		default: 
			MessageBox(hWnd,"Invalid color numbers!","Error Message",MB_OK|MB_ICONEXCLAMATION); 
			_lclose(hf); 
			return FALSE; 
		} 
	} 
	else 
		NumColors=(DWORD)bi.biClrUsed; 
	////////////// 
	//分配全局内存 infoHeader+palette+img 
	if(hImgData!=NULL) 
		GlobalFree(hImgData); 
 
	if((hImgData=GlobalAlloc(GHND, 
		(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL) 
	{ 
		MessageBox(hWnd,"Mem alloc error!","Error",MB_OK|MB_ICONEXCLAMATION); 
		_lclose(hf); 
		return FALSE; 
	} 
	//lpImgData锁定内存 
	lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); 
	_llseek(hf,sizeof(BITMAPFILEHEADER),0); 
	//将文件内容读入内存(除BITMAPFILEHEADER) 
 
	_hread(hf,(char*)lpImgData, 
		(long)sizeof(BITMAPINFOHEADER)+(long)sizeof(RGBQUAD)*NumColors+ImgSize); 
	//hf closed 
	_lclose(hf); 
///产生调色盘 
	if(NumColors!=0) //NumColors不为零,说明用到了调色板 
 
{ 
 
//为逻辑调色板分配局部内存,大小为逻辑调色板结构长度加 
 
//NumColors个PALETTENTRY 
 
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors* sizeof(PALETTEENTRY)); 
 
//指针pPal指向该内存区 
 
pPal =(LOGPALETTE *)LocalLock(hPal); 
 
   //填写逻辑调色板结构的头 
 
pPal->palNumEntries =(unsigned short) NumColors; 
 
   pPal->palVersion = 0x300; 
 
//lpRGB指向的是调色板开始的位置 
 
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + 
 
(DWORD)sizeof(BITMAPINFOHEADER)); 
 
//填写每一项 
unsigned int i; 
for (i = 0; i < NumColors; i++) 
 
   { 
 
pPal->palPalEntry[i].peRed=lpRGB->rgbRed; 
 
pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen; 
 
pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue; 
 
pPal->palPalEntry[i].peFlags=(BYTE)0; 
 
lpRGB++; //指针移到下一项 
 
} 
 
//产生逻辑调色板,hPalette是一个全局变量 
 
hPalette=CreatePalette(pPal); 
 
//释放局部内存 
 
LocalUnlock(hPal); 
 
LocalFree(hPal); 
 
} 
 
//获得设备上下文句柄 
 
		hDc=GetDC(hWnd); 
 
if(hPalette) //如果刚才产生了逻辑调色板 
 
{ 
 
//将新的逻辑调色板选入DC,将旧的逻辑调色板句柄保存在//hPrevPalette 
 
hPrevPalette=SelectPalette(hDc,hPalette,FALSE); 
 
RealizePalette(hDc); 
 
} 
	//产生位图句柄 
 
	if(hBitmap!=NULL) 
		DeleteObject(hBitmap); 
 
	hBitmap = CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData, 
		(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD), 
		(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS); 
	//将原来的调色板(如果有的话)选入设备上下文句柄 
 
if(hPalette && hPrevPalette) 
 
{ 
 
SelectPalette(hDc,hPrevPalette,FALSE); 
 
RealizePalette(hDc); 
 
} 
 
	ReleaseDC(hWnd,hDc); 
 
	GlobalUnlock(hImgData); 
 
	return TRUE; 
} 
////////////////////////////////////////////////////////////////////endLoadBmp 
//void PopFileInitialize (HWND); 
void load_bmp_file::PopFileInitialize (HWND hwnd) 
         
{ 
         
           static TCHAR szFilter[] =     TEXT ("BMP Files (*.BMP)\0*.bmp\0")  \ 
         
                                        TEXT ("JPEG Files (*.JPG)\0*.jpg\0") \ 
         
                                         TEXT ("All Files (*.*)\0*.*\0\0") ; 
         
    
         
           ofn.lStructSize                      = sizeof (OPENFILENAME) ; 
         
           ofn.hwndOwner                        = hwnd ; 
         
           ofn.hInstance                        = NULL ; 
         
           ofn.lpstrFilter                      = szFilter ; 
         
           ofn.lpstrCustomFilter = NULL ; 
         
           ofn.nMaxCustFilter    = 0 ; 
         
           ofn.nFilterIndex      = 0 ; 
         
           ofn.lpstrFile         = NULL ;              // Set in Open and Close functions 
         
           ofn.nMaxFile                = MAX_PATH ; 
         
           ofn.lpstrFileTitle            = NULL ;              // Set in Open and Close functions 
         
           ofn.nMaxFileTitle             = MAX_PATH ; 
         
           ofn.lpstrInitialDir           = NULL ; 
         
           ofn.lpstrTitle                = NULL ; 
         
           ofn.Flags                    = 0 ;                         // Set in Open and Close functions 
         
           ofn.nFileOffset               = 0 ; 
         
           ofn.nFileExtension            = 0 ; 
         
           ofn.lpstrDefExt               = TEXT ("bmp") ; 
         
           ofn.lCustData                 = 0; 
         
           ofn.lpfnHook                  = NULL ; 
         
          ofn.lpTemplateName            = NULL ; 
         
} 
//////////////////// 
#define TEMPLATE_HORZ_SOBEL        2 
#define TEMPLATE_VERT_SOBEL			1 
BOOL load_bmp_file::TemplateOperation(HWND hWnd, int TemplateType,int Type)//Type==1时Add, 
{ 
	//array def 
float Template_Horz_Sobel[9]={-1,0,1,-(float)sqrt(2),0,(float)sqrt(2),-1,0,1}; 
float Template_Horz_Sobel_Vert[9]={-1,-(float)sqrt(2),-1,0,0,0,1,(float)sqrt(2),1}; 
float Template_M1_Sobel[9]={2,1,0,1,0,-1,0,-1,-2}; 
float Template_M3_Sobel[9]={0,-1,-2,1,0,-1,2,1,0}; 
///////////////////////def 
       DWORD                 OffBits,BufSize,LineBytes; 
 
	   LPBITMAPINFOHEADER    lpImgData; 
 
       LPSTR                   lpPtr; 
 
       HLOCAL                  hTempImgData; 
 
       LPBITMAPINFOHEADER    lpTempImgData; 
 
       LPSTR                   lpTempPtr; 
 
       HDC                      hDc; 
 
       HFILE                  hf; 
 
       LONG                  x,y; 
 
       float                    coef;  //模板前面所乘的系数 
 
       float                       CoefArray[9]; //模板数组 
 
       float                     TempNum; 
 
       char                     filename[80]; 
 
	   BYTE curColor; 
 
	   int i=0; 
	   int stringlen; 
 
       switch(TemplateType) 
	   { //判断模板类型 
			case TEMPLATE_HORZ_SOBEL: 
					coef = (float)1.0; 
					for(i=0;i<9;i++) 
					{ 
						CoefArray[i] = Template_Horz_Sobel[i]; 
					} 
			break; 
			case TEMPLATE_VERT_SOBEL: 
					coef = (float)1.0; 
					for(i=0;i<9;i++) 
					{ 
						CoefArray[i] = Template_Horz_Sobel_Vert[i]; 
					} 
			break; 
	   } 
 
       OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); 
 
	   LineBytes =(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); 
 
       BufSize=OffBits+bi.biHeight*LineBytes; 
 
       if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL) 
 
{ 
 
            MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION); 
 
return FALSE; 
 
} 
 
     lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);     
 
       lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); 
 
       lpPtr=(char *)lpImgData; 
 
       lpTempPtr=(char *)lpTempImgData; 
 
//先将原图直接拷贝过来,其实主要是拷贝周围一圈的象素 
 
       memcpy(lpTempPtr,lpPtr,BufSize); 
/////////////////////////////////////////////////// 
       for(y=1;y255.0) *lpTempPtr=(BYTE)255; 
 
                            else if(TempNum<0.0)  
 
                                   *lpTempPtr=(unsigned char)fabs(TempNum); 
 
                            else *lpTempPtr=(BYTE)TempNum; 
		   }/////////horz 
///////////////////////////////vert 
	if(Type == 1) 
	{	    
		   for(i=0;i<9;i++) 
				{ 
					CoefArray[i] = Template_Horz_Sobel_Vert[i]; 
				} 
 
	   //////////////////////////////////////// 
 
       for(y=1;y255.0) *lpTempPtr=(BYTE)255; 
			   else 
			   { 
				   if(TempNum<0.0)  
					   TempNum=fabs(TempNum); 
					curColor =*lpTempPtr; 
					if((BYTE)TempNum>curColor) 
					{ 
						*lpTempPtr=(BYTE)TempNum; 
					} 
			   } 
		   }/////////vert 
 
		   for(i=0;i<9;i++) 
				{ 
					CoefArray[i] = Template_M1_Sobel[i]; 
				} 
 
	   //////////////////////////////////////// 
 
       for(y=1;y255.0) *lpTempPtr=(BYTE)255; 
			   else 
			   { 
				   if(TempNum<0.0)  
					   TempNum=fabs(TempNum); 
					curColor =*lpTempPtr; 
					if((BYTE)TempNum>curColor) 
					{ 
						*lpTempPtr=(BYTE)TempNum; 
					} 
			   } 
		  }/////////m1 
		   for(i=0;i<9;i++) 
				{ 
					CoefArray[i] = Template_M3_Sobel[i]; 
				} 
 
	   //////////////////////////////////////// 
 
       for(y=1;y255.0) *lpTempPtr=(BYTE)255; 
			   else 
			   { 
				   if(TempNum<0.0)  
					   TempNum=fabs(TempNum); 
					curColor =*lpTempPtr; 
					if((BYTE)TempNum>curColor) 
					{ 
						*lpTempPtr=(BYTE)TempNum; 
					} 
			   } 
		  }//////M3 
	} 
/////////////////// 
 
 
hDc=GetDC(hWnd); 
 
     if(hBitmap!=NULL) 
           DeleteObject(hBitmap); 
if(!(hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS))) 
	MessageBox(hWnd,"CreateBitmap Failed!","Warning!",MB_OK); 
 
	memcpy(lpImgData,lpTempImgData,BufSize); 
 
      ReleaseDC(hWnd,hDc); 
 
       LocalUnlock(hTempImgData); 
 
       LocalFree(hTempImgData); 
 
       GlobalUnlock(hImgData); 
 
       return TRUE; 
 
} 
point load_bmp_file::FindCenter() 
{ 
       DWORD                 OffBits,BufSize,LineBytes; 
 
	   LPBITMAPINFOHEADER    lpImgData; 
 
       LPSTR                   lpPtr; 
 
       LONG                  x,y; 
	   BYTE curColor; 
 
	   point Center; 
	   Center.x = Center.y =0; 
 
	   int *NumInLine = new int[bi.biHeight]; 
	   int *NumInRow  = new int[bi.biWidth]; 
 
	   for(x=0;x MaxNum) 
		{ 
			MaxNum = NumCount; 
			Pos = y; 
		} 
	} 
	Center.y = Pos; 
	MaxNum = -1; Pos = 0; 
	for(x=WindowHeight/2;xMaxNum) 
		{ 
			MaxNum = NumCount; 
			Pos = x; 
		} 
	} 
	Center.x = Pos; 
 
       GlobalUnlock(hImgData); 
delete [] NumInLine; 
delete [] NumInRow; 
       return Center; 
 
}