www.pudn.com > PCA_faceRec_V2.rar > CDIB.CPP


#include "stdafx.h" 
#include "cdib.h" 
#include "windowsx.h" 
#include "math.h" 
#include "MiDu.h" 
#include  
 
// 
#include "StdAfx.h" 
#include  
#include  
#include  
#include  
#include  
using namespace std; 
// 
 
#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)  
 
int row_diff_sum[100]={0}; 
int col_diff_sum[100]={0}; 
int heigth=0,width=0; 
CDib::CDib() 
{ 
	size=0; 
 
} 
 
CDib::~CDib() 
{ 
    GlobalFreePtr(m_pBitmapInfo); 
} 
 
void CDib::LoadFile(const char* dibFileName) 
{ 
    // 
	CString tmp; 
	char* temp_name='\0'; 
 
	// 
	strcpy(m_fileName,dibFileName); 
    CFile dibFile(m_fileName, CFile::modeRead);//可读的 modeReadWrite 
    dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));//把数据读到bitmapFileHeader缓冲区中 
    if (bitmapFileHeader.bfType == 0x4d42)  //判断是否是一个bitmap 
    { 
        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; 
 
        // 
		heigth=m_pBitmapInfoHeader->biHeight; 
		width=m_pBitmapInfoHeader->biWidth; 
		//pt=(BYTE*)malloc(m_pBitmapInfoHeader->biSizeImage); 
        //memcpy(pt,m_pData,m_pBitmapInfoHeader->biSizeImage); 
 
	//	for(int i=1;i<1000;i++)*m_pData++=0;		 
		//tmp.Format("BMP size:%d biWidth:%d height:%d", m_pBitmapInfoHeader->biSizeImage,m_pBitmapInfoHeader->biWidth,m_pBitmapInfoHeader->biHeight); 
		//AfxMessageBox(tmp); 
		//strcat(m_fileName,"copy.bmp"); 
		//CDib::SaveFile(m_fileName); 
 
	//	strcpy(m_fileName,dibFileName); 
		//memcpy(m_pData,pt,m_pBitmapInfoHeader->biSizeImage); 
        //m_pData=pt; 
		//strcat(m_fileName,"ne.bmp"); 
        //CDib::SaveFile(m_fileName); 
 
 
    }     
    else 
    { 
        m_valid = FALSE; 
        AfxMessageBox("This isn't a bitmap file!"); 
	} 
} 
//zou 
void CDib::CheckFile(const char* filename,const char*  filename2) 
{ 
    BYTE *pt1,*pt2; 
	FILE *fp1,*fp2; 
 
	fp1=fopen("diff_row.txt","wb"); 
	fp2=fopen("diff_col.txt","wb"); 
	 
	LoadFile(filename); 
    pt1=(BYTE*)malloc(m_pBitmapInfoHeader->biSizeImage); 
    memcpy(pt1,m_pData,m_pBitmapInfoHeader->biSizeImage); 
 
	LoadFile(filename2); 
	pt2=(BYTE*)malloc(m_pBitmapInfoHeader->biSizeImage); 
    memcpy(pt2,m_pData,m_pBitmapInfoHeader->biSizeImage); 
 
 
 
 for(int h=0;hbiHeight;h++) 
	{ 
   for(int w=0;wbiWidth;w++) 
	   row_diff_sum[h]+=abs(pt1[w+h*100]-pt2[w+h*100]); 
   fprintf(fp1, "|pt1-pt2|= %d \n",row_diff_sum[h]);  
	} 
 fclose(fp1); 
 
for(int w=0;wbiWidth;w++) 
	{ 
    for(int h=0;hbiHeight;h++) 
		col_diff_sum[w]+=abs(pt1[w+h*100]-pt2[w+h*100]); 
    fprintf(fp2, "|pt1-pt2|= %d \n",col_diff_sum[w]);  
	} 
 fclose(fp2); 
} 
 
// 
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; 
} 
 
 
         
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 1: numberOfColors = 2; break; 
		case 4: numberOfColors = 16; break; 
		case 8: numberOfColors = 256; 
		} 
	} 
    else 
		numberOfColors = (int) m_pBitmapInfoHeader->biClrUsed; 
	 
    return numberOfColors; 
} 
     
bool  CDib::read_Bigphoto_name(const char * s,int& PhotoNum,string Bigphoto_name[]) 
{ 
	{ 
	 WIN32_FIND_DATA fd; 
          HANDLE hFind; 
         CListm_filelist;  
		    
	      hFind=::FindFirstFile(s,&fd); 
	      assert(!(hFind==INVALID_HANDLE_VALUE));		        
		  int count=0; 
	      do  
		  { 
	        	m_filelist.AddTail(CString(fd.cFileName)); 
				count++; 
		  } while(::FindNextFile(hFind,&fd)); 
	      ::FindClose(hFind); 
 
	      POSITION pos=m_filelist.GetHeadPosition(); 
	      CString strFile; 
		  int i=0;     
	      while (pos) 
		  {	    	 
		 
		    strFile=m_filelist.GetNext(pos); 
			Bigphoto_name[i]=strFile; 
		    printf("%s ",strFile);		  
	            i++; 
		  } 
		  PhotoNum=i; 
		  return true; 
} 
	 
 
 
 
} 
 
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(); 
	 
} 
 
DWORD CDib::GetDibWidthBytes() 
{ 
	byBitCount=m_pBitmapInfoHeader->biBitCount; 
	LONG nWidth=m_pBitmapInfoHeader->biWidth; 
	 
	dwWidthBytes = (DWORD)m_pBitmapInfoHeader->biWidth;	 
	if(byBitCount == 1) dwWidthBytes = (nWidth + 7) / 8; 
	else if(byBitCount == 4) dwWidthBytes = (nWidth + 1) / 2; 
	else if(byBitCount == 24) dwWidthBytes = 3 * nWidth ; 
	 
	while((dwWidthBytes & 3) != 0)dwWidthBytes++; 
	 
	return dwWidthBytes; 
} 
 
 
//对24位彩色图像进行灰度概率统计 
void CDib::ZhiFangTu(MiDu* midu) 
{ 
	// 循环变量 
	int i; 
	int j; 
 
 
	// 灰度计数 
	int huidu1[256],huidu2[256],huidu3[256];     
	int wide,height;    //原图长、宽 
	wide=this->GetWidth ();		  
	height=this->GetHeight (); 
 
	memset(midu->red,0,sizeof(midu->red)); 
	//memset(midu.green,0,256); 
	//memset(midu.blue,0,256); 
	// 变量初始化 
	memset(huidu1,0,sizeof(huidu1)); 
	memset(huidu2,0,sizeof(huidu2)); 
	memset(huidu3,0,sizeof(huidu3));		   
	LPBYTE  temp_pData=new BYTE[wide*height*3];    //新图像缓冲区 
	//拷贝原图像到缓存图像 
	memcpy(temp_pData,m_pData,wide*height*3); 
	// 对各像素进行灰度统计 
	for (j = 0; j < height; j ++) 
	{ 
		for (i = 0; i red[i] = huidu1[i];	 
		midu->green[i] = huidu2[i];	 
		midu->blue[i] = huidu3[i];	 
	} 
}