www.pudn.com > pict.rar > ImageMeasureDoc.cpp
// ImageMeasureDoc.cpp : implementation of the CImageMeasureDoc class // #include "stdafx.h" #include "ImageMeasure.h" #include#include "ImageMeasureDoc.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CImageMeasureDoc IMPLEMENT_DYNCREATE(CImageMeasureDoc, CDocument) BEGIN_MESSAGE_MAP(CImageMeasureDoc, CDocument) //{{AFX_MSG_MAP(CImageMeasureDoc) ON_COMMAND(ID_MIDFILTER, OnMidfilter) ON_COMMAND(ID_SHARP, OnSharp) ON_COMMAND(ID_MAX, OnMax) ON_COMMAND(ID_MIN, OnMin) ON_COMMAND(ID_ROBERTS, OnRoberts) ON_COMMAND(ID_PREWITT, OnPrewitt) ON_COMMAND(ID_SOBEL, OnSobel) ON_COMMAND(ID_KIRSCH, OnKirsch) ON_COMMAND(ID_TWO, OnTwo) ON_COMMAND(ID_XIHUA, OnXihua) ON_COMMAND(ID_MIANJI, OnMianji) ON_COMMAND(ID_SMOOTH, OnSmooth) ON_COMMAND(ID_LENGTH, OnLength) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CImageMeasureDoc construction/destruction CImageMeasureDoc::CImageMeasureDoc() { pBits = NULL; // TODO: add one-time construction code here } CImageMeasureDoc::~CImageMeasureDoc() { } BOOL CImageMeasureDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CImageMeasureDoc serialization void CImageMeasureDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } } ///////////////////////////////////////////////////////////////////////////// // CImageMeasureDoc diagnostics #ifdef _DEBUG void CImageMeasureDoc::AssertValid() const { CDocument::AssertValid(); } void CImageMeasureDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CImageMeasureDoc commands BOOL CImageMeasureDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) { AfxMessageBox("open failed"); return FALSE; } HBITMAP hbitmap = (HBITMAP)::LoadImage(NULL,lpszPathName,IMAGE_BITMAP, 0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); if( hbitmap==NULL) { AfxMessageBox("The file doesn't contain a dib"); return false; } m_Bitmap.Attach(hbitmap); if((HBITMAP)m_Bitmap!=NULL) { DIBSECTION dib; m_Bitmap.GetObject(sizeof(DIBSECTION),&dib); m_lWidth = dib.dsBmih.biWidth; m_lHeight = dib.dsBmih.biHeight; pBits = (unsigned char *)dib.dsBm.bmBits; m_Color = dib.dsBmih.biBitCount; switch(m_Color) { case(8): WIDTH = (m_lWidth + 3)/4; WIDTH *=4; break; case(24): WIDTH = (m_lWidth*3 +3)/4; WIDTH *=4; break; default: break; } } // TODO: Add your specialized creation code here return TRUE; } BOOL CImageMeasureDoc::OnSaveDocument(LPCTSTR lpszPathName) { // TODO: Add your specialized code here and/or call the base class if((HBITMAP) m_Bitmap!=NULL) { BITMAPFILEHEADER bmfHdr; //BMP文件头 DWORD dwDIBsize=0; //DIB大小 DIBSECTION ds; m_Bitmap.GetObject(sizeof(DIBSECTION),&ds); LPBITMAPINFOHEADER lpBI; lpBI=&ds.dsBmih; dwDIBsize+=sizeof(BITMAPINFOHEADER); if(m_Color==8) { dwDIBsize+=DWORD(sizeof(RGBQUAD)*pow(2,8)); } dwDIBsize+=WIDTH*m_lHeight; bmfHdr.bfType=0x4D42; bmfHdr.bfSize=dwDIBsize+sizeof(BITMAPFILEHEADER); bmfHdr.bfReserved1=0; bmfHdr.bfReserved2=0; bmfHdr.bfOffBits=bmfHdr.bfSize-WIDTH*m_lHeight; unsigned char* pBmpFile=new unsigned char[dwDIBsize+sizeof(BITMAPFILEHEADER)]; memcpy(pBmpFile,&bmfHdr,sizeof(BITMAPFILEHEADER)); memcpy(pBmpFile+sizeof(BITMAPFILEHEADER),lpBI,sizeof(BITMAPINFOHEADER)); if(m_Color==8) { CClientDC dc(NULL); RGBQUAD* pRGB = new RGBQUAD[256]; CDC memDC; memDC.CreateCompatibleDC (&dc); CBitmap* pOldBitmap = memDC.SelectObject (&m_Bitmap); ::GetDIBColorTable ((HDC) memDC, 0, 256, pRGB); memDC.SelectObject (pOldBitmap); memcpy(pBmpFile+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER),pRGB, sizeof(RGBQUAD)*256); delete [] pRGB; } memcpy(pBmpFile+bmfHdr.bfOffBits,pBits,WIDTH*m_lHeight); CFile file; CFileException e; if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeWrite| CFile::modeNoTruncate|CFile::shareDenyNone,&e)) { e.ReportError(); return false; } file.Write(pBmpFile,bmfHdr.bfSize); delete [] pBmpFile; return true; } return CDocument::OnSaveDocument(lpszPathName); } void CImageMeasureDoc::DeleteContents() { // TODO: Add your specialized code here and/or call the base class if((HBITMAP)m_Bitmap!=NULL) { m_Bitmap.DeleteObject(); } CDocument::DeleteContents(); } void CImageMeasureDoc::OnSmooth() { unsigned char* pls=new unsigned char[m_lHeight*WIDTH]; memcpy(pls,pBits,m_lHeight*WIDTH); for (int i=3;i<(m_lHeight-2);i++) //将3*3矩阵取平均值 { for (int j=3;j<(m_lWidth-2);j++) { *(pls+i*WIDTH+j)=(*(pBits+i*WIDTH+j)+*(pBits+i*WIDTH+j+1)+*(pBits+i*WIDTH+j-1) +*(pBits+i*WIDTH+j+WIDTH)+*(pBits+i*WIDTH+j+WIDTH+1)+*(pBits+i*WIDTH+j+WIDTH-1)+ *(pBits+i*WIDTH+j-WIDTH)+*(pBits+i*WIDTH+j-WIDTH+1)+*(pBits+i*WIDTH+j-WIDTH-1))/9; } } memcpy(pBits,pls,m_lHeight*WIDTH); delete[]pls; UpdateAllViews(NULL); // TODO: Add your command handler code here } void CImageMeasureDoc::OnMidfilter() { unsigned char* pls=new unsigned char[m_lHeight*WIDTH]; memcpy(pls,pBits,m_lHeight*WIDTH); for(int i=3;i 255) result = 255; *(pls + i*WIDTH +j) = result; } } memcpy(pBits,pls,m_lHeight*WIDTH); delete[]pls; UpdateAllViews(NULL); // TODO: Add your command handler code here } void CImageMeasureDoc::OnMax() { unsigned char* pls=new unsigned char[m_lHeight*WIDTH]; memcpy(pls,pBits,m_lHeight*WIDTH); for(int i=3;i resulty) *(pls+i*WIDTH+j)=resultx; else *(pls+i*WIDTH+j)=resulty; if(*(pls+i*WIDTH+j)>255) *(pls+i*WIDTH+j)= 255; } } memcpy(pBits,pls,m_lHeight*WIDTH); delete[]pls; UpdateAllViews(NULL); // TODO: Add your command handler code here } void CImageMeasureDoc::OnPrewitt() { int dx[9]; dx[0]=1; dx[1]=1; dx[2]=1; dx[3]=0; dx[4]=0; dx[5]=0; dx[6]=0-1; dx[7]=0-1; dx[8]=0-1; int dy[9]; dy[0]=0; dy[1]=1; dy[2]=1; dy[3]=0-1; dy[4]=0; dy[5]=1; dy[6]=0-1; dy[7]=0-1; dy[8]=0; int dxx[9]; int dyy[9]; dxx[0]=0-1; dxx[1]=0; dxx[2]=1; dxx[3]=0-1; dxx[4]=0; dxx[5]=1; dxx[6]=0-1; dxx[7]=0; dxx[8]=0-1; dyy[0]=1; dyy[1]=1; dyy[2]=0; dyy[3]=1; dyy[4]=0; dyy[5]=0-1; dyy[6]=0; dyy[7]=0-1; dyy[8]=0-1; int resultx=0; int resulty=0; int resultxx=0; int resultyy=0; int i=0; int j=0; unsigned char* pls=new unsigned char[m_lHeight*WIDTH]; memcpy(pls,pBits,m_lHeight*WIDTH); for ( i=3;i<(m_lHeight-2);i++) { for (j=3;j<(m_lWidth-2);j++) { resultx=abs(*(pBits+i*WIDTH+j)*dx[4]+*(pBits+i*WIDTH+j+1)*dx[5]+*(pBits+i*WIDTH+j-1)*dx[3] +*(pBits+i*WIDTH+j+WIDTH)*dx[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dx[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dx[6]+ *(pBits+i*WIDTH+j-WIDTH)*dx[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dx[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dx[0]); resulty=abs(*(pBits+i*WIDTH+j)*dy[4]+*(pBits+i*WIDTH+j+1)*dy[5]+*(pBits+i*WIDTH+j-1)*dy[3] +*(pBits+i*WIDTH+j+WIDTH)*dy[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dy[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dy[6]+ *(pBits+i*WIDTH+j-WIDTH)*dy[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dy[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dy[0]); resultxx=abs(*(pBits+i*WIDTH+j)*dxx[4]+*(pBits+i*WIDTH+j+1)*dxx[5]+*(pBits+i*WIDTH+j-1)*dxx[3] +*(pBits+i*WIDTH+j+WIDTH)*dxx[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dxx[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dxx[6]+ *(pBits+i*WIDTH+j-WIDTH)*dxx[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dxx[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dxx[0]); resultyy=abs(*(pBits+i*WIDTH+j)*dyy[4]+*(pBits+i*WIDTH+j+1)*dyy[5]+*(pBits+i*WIDTH+j-1)*dyy[3] +*(pBits+i*WIDTH+j+WIDTH)*dyy[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dyy[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dyy[6]+ *(pBits+i*WIDTH+j-WIDTH)*dyy[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dyy[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dyy[0]); if (resultx>resulty) *(pls+i*WIDTH+j)=resultx; if (resulty>*(pls+i*WIDTH+j)) *(pls+i*WIDTH+j)=resulty; if (resultxx>*(pls+i*WIDTH+j)) *(pls+i*WIDTH+j)=resultxx; else *(pls+i*WIDTH+j)=resultyy; if(*(pls+i*WIDTH+j)>255) *(pls+i*WIDTH+j)= 255; } } memcpy(pBits,pls,m_lHeight*WIDTH); delete[]pls; UpdateAllViews(NULL); // TODO: Add your command handler code here } void CImageMeasureDoc::OnSobel() { int dx[9]; dx[0]=0-1; dx[1]=0-2; dx[2]=0-1; dx[3]=0; dx[4]=0; dx[5]=0; dx[6]=1; dx[7]=2; dx[8]=1; int dy[9]; dy[0]=0-1; dy[1]=0; dy[2]=1; dy[3]=0-2; dy[4]=0; dy[5]=2; dy[6]=0-1; dy[7]=0; dy[8]=1; int resultx=0; int resulty=0; int i=0; int j=0; unsigned char* pls=new unsigned char[m_lHeight*WIDTH]; memcpy(pls,pBits,m_lHeight*WIDTH); for ( i=3;i<(m_lHeight-2);i++) { for (j=3;j<(m_lWidth-2);j++) { resultx=abs(*(pBits+i*WIDTH+j)*dx[4]+*(pBits+i*WIDTH+j+1)*dx[5]+*(pBits+i*WIDTH+j-1)*dx[3] +*(pBits+i*WIDTH+j+WIDTH)*dx[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dx[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dx[6]+ *(pBits+i*WIDTH+j-WIDTH)*dx[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dx[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dx[0]); resulty=abs(*(pBits+i*WIDTH+j)*dy[4]+*(pBits+i*WIDTH+j+1)*dy[5]+*(pBits+i*WIDTH+j-1)*dy[3] +*(pBits+i*WIDTH+j+WIDTH)*dy[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dy[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dy[6]+ *(pBits+i*WIDTH+j-WIDTH)*dy[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dy[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dy[0]); if (resultx>resulty) *(pls+i*WIDTH+j)=resultx; else *(pls+i*WIDTH+j)=resulty; if(*(pls+i*WIDTH+j)>255) *(pls+i*WIDTH+j)= 255; } } memcpy(pBits,pls,m_lHeight*WIDTH); delete[]pls; UpdateAllViews(NULL); // TODO: Add your command handler code here } void CImageMeasureDoc::OnKirsch() { int dx[9]; dx[0]=0; dx[1]=0; dx[2]=0; dx[3]=0; dx[4]=0; dx[5]=0; dx[6]=0-5; dx[7]=0-5; dx[8]=0-5; int dy[9]; dy[0]=0; dy[1]=0; dy[2]=0; dy[3]=0-5; dy[4]=0; dy[5]=0; dy[6]=0-5; dy[7]=0-5; dy[8]=0; int dxx[9]; int dyy[9]; dxx[0]=0-5; dxx[1]=0; dxx[2]=0; dxx[3]=0-5; dxx[4]=0; dxx[5]=0; dxx[6]=0-5; dxx[7]=0; dxx[8]=0; dyy[0]=0-5; dyy[1]=0-5; dyy[2]=0; dyy[3]=0-5; dyy[4]=0; dyy[5]=0; dyy[6]=0; dyy[7]=0; dyy[8]=0; int dxa[9]; dxa[0]=0; dxa[1]=0; dxa[2]=0; dxa[3]=0; dxa[4]=0; dxa[5]=0; dxa[6]=0-5; dxa[7]=0-5; dxa[8]=0-5; int dya[9]; dya[0]=0; dya[1]=0; dya[2]=0; dya[3]=0-5; dya[4]=0; dya[5]=0; dya[6]=0-5; dya[7]=0-5; dya[8]=0; int dxxa[9]; int dyya[9]; dxxa[0]=0-5; dxxa[1]=0; dxxa[2]=0; dxxa[3]=0-5; dxxa[4]=0; dxxa[5]=0; dxxa[6]=0-5; dxxa[7]=0; dxxa[8]=0; dyya[0]=0-5; dyya[1]=0-5; dyya[2]=0; dyya[3]=0-5; dyya[4]=0; dyya[5]=0; dyya[6]=0; dyya[7]=0; dyya[8]=0; int resultx=0; int resulty=0; int resultxx=0; int resultyy=0; int resultxa=0; int resultya=0; int resultxxa=0; int resultyya=0; int i=0; int j=0; unsigned char* pls=new unsigned char[m_lHeight*WIDTH]; memcpy(pls,pBits,m_lHeight*WIDTH); for ( i=3;i<(m_lHeight-2);i++) { for (j=3;j<(m_lWidth-2);j++) { resultx=abs(*(pBits+i*WIDTH+j)*dx[4]+*(pBits+i*WIDTH+j+1)*dx[5]+*(pBits+i*WIDTH+j-1)*dx[3] +*(pBits+i*WIDTH+j+WIDTH)*dx[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dx[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dx[6]+ *(pBits+i*WIDTH+j-WIDTH)*dx[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dx[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dx[0]); resulty=abs(*(pBits+i*WIDTH+j)*dy[4]+*(pBits+i*WIDTH+j+1)*dy[5]+*(pBits+i*WIDTH+j-1)*dy[3] +*(pBits+i*WIDTH+j+WIDTH)*dy[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dy[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dy[6]+ *(pBits+i*WIDTH+j-WIDTH)*dy[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dy[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dy[0]); //2 resultxx=abs(*(pBits+i*WIDTH+j)*dxx[4]+*(pBits+i*WIDTH+j+1)*dxx[5]+*(pBits+i*WIDTH+j-1)*dxx[3] +*(pBits+i*WIDTH+j+WIDTH)*dxx[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dxx[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dxx[6]+ *(pBits+i*WIDTH+j-WIDTH)*dxx[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dxx[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dxx[0]); resulty=abs(*(pBits+i*WIDTH+j)*dyy[4]+*(pBits+i*WIDTH+j+1)*dyy[5]+*(pBits+i*WIDTH+j-1)*dyy[3] +*(pBits+i*WIDTH+j+WIDTH)*dyy[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dyy[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dyy[6]+ *(pBits+i*WIDTH+j-WIDTH)*dyy[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dyy[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dyy[0]); //4 resultxa=abs(*(pBits+i*WIDTH+j)*dxa[4]+*(pBits+i*WIDTH+j+1)*dxa[5]+*(pBits+i*WIDTH+j-1)*dxa[3] +*(pBits+i*WIDTH+j+WIDTH)*dxa[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dxa[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dxa[6]+ *(pBits+i*WIDTH+j-WIDTH)*dxa[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dxa[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dxa[0]); resultya=abs(*(pBits+i*WIDTH+j)*dya[4]+*(pBits+i*WIDTH+j+1)*dya[5]+*(pBits+i*WIDTH+j-1)*dya[3] +*(pBits+i*WIDTH+j+WIDTH)*dya[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dya[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dya[6]+ *(pBits+i*WIDTH+j-WIDTH)*dya[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dya[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dya[0]); //6 resultxxa=abs(*(pBits+i*WIDTH+j)*dxxa[4]+*(pBits+i*WIDTH+j+1)*dxxa[5]+*(pBits+i*WIDTH+j-1)*dxxa[3] +*(pBits+i*WIDTH+j+WIDTH)*dxxa[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dxxa[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dxxa[6]+ *(pBits+i*WIDTH+j-WIDTH)*dxxa[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dxxa[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dxxa[0]); resultyya=abs(*(pBits+i*WIDTH+j)*dyya[4]+*(pBits+i*WIDTH+j+1)*dyya[5]+*(pBits+i*WIDTH+j-1)*dyya[3] +*(pBits+i*WIDTH+j+WIDTH)*dyya[7]+*(pBits+i*WIDTH+j+WIDTH+1)*dyya[8]+*(pBits+i*WIDTH+j+WIDTH-1)*dyya[6]+ *(pBits+i*WIDTH+j-WIDTH)*dyya[1]+*(pBits+i*WIDTH+j-WIDTH+1)*dyya[2]+*(pBits+i*WIDTH+j-WIDTH-1)*dyya[0]); if (resultx>resulty) *(pls+i*WIDTH+j)=resultx; if (resulty>*(pls+i*WIDTH+j)) *(pls+i*WIDTH+j)=resulty; if (resultxx>*(pls+i*WIDTH+j)) *(pls+i*WIDTH+j)=resultxx; if (resultyy>*(pls+i*WIDTH+j)) *(pls+i*WIDTH+j)=resultyy; if (resultxa>*(pls+i*WIDTH+j)) *(pls+i*WIDTH+j)=resultxa; if (resultya>*(pls+i*WIDTH+j)) *(pls+i*WIDTH+j)=resultya; if (resultxxa>*(pls+i*WIDTH+j)) *(pls+i*WIDTH+j)=resultxxa; else *(pls+i*WIDTH+j)=resultyya; if(*(pls+i*WIDTH+j)>255) *(pls+i*WIDTH+j)= 255; } } memcpy(pBits,pls,m_lHeight*WIDTH); delete[]pls; UpdateAllViews(NULL); // TODO: Add your command handler code here } void CImageMeasureDoc::OnTwo() { long int a[256]; for (int l=0;l<256;l++) a[l]=0; int hui; long int sum=0; long int sum1=0; long int sum2=0; long int s=m_lHeight*m_lWidth;//总像素数 long int s1=0; long int s2=0; int ave; int ave1; int ave2; int i; int j; for (i=0;i ave) *(pBits+i*WIDTH+j)=255; else *(pBits+i*WIDTH+j)=0; } } UpdateAllViews(NULL); // TODO: Add your command handler code here } void CImageMeasureDoc::OnXihua() { int k; int i; int j; for (i=0;i l[d]&&l[d]!=0){ min=l[d]; } } for(d=0;d<4;d++){ if(max l[d]&&l[d]!=0){ min=l[d]; } } for(d=0;d<4;d++){ if(max