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;h biHeight;h++) { for(int w=0;w biWidth;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;w biWidth;w++) { for(int h=0;h biHeight;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; CList m_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]; } }