⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmpsearchview.cpp

📁 本代码是用来搜索bmp图像中的模板图像。读入图像后
💻 CPP
字号:
// BmpSearchView.cpp : implementation of the CBmpSearchView class
//

#include "stdafx.h"
#include "BmpSearch.h"

#include "BmpSearchDoc.h"
#include "BmpSearchView.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBmpSearchView

IMPLEMENT_DYNCREATE(CBmpSearchView, CView)

BEGIN_MESSAGE_MAP(CBmpSearchView, CView)
	//{{AFX_MSG_MAP(CBmpSearchView)
	ON_COMMAND(ID_OPENSOURCEFILE, OnOpensourcefile)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBmpSearchView construction/destruction

CBmpSearchView::CBmpSearchView()
{
	// TODO: add construction code here

}

CBmpSearchView::~CBmpSearchView()
{
}

BOOL CBmpSearchView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBmpSearchView drawing

void CBmpSearchView::OnDraw(CDC* pDC)
{
	CBmpSearchDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	//CBmpProc *pDestBmp,*pBmp;
	


}

/////////////////////////////////////////////////////////////////////////////
// CBmpSearchView printing

BOOL CBmpSearchView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CBmpSearchView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CBmpSearchView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CBmpSearchView diagnostics

#ifdef _DEBUG
void CBmpSearchView::AssertValid() const
{
	CView::AssertValid();
}

void CBmpSearchView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CBmpSearchDoc* CBmpSearchView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBmpSearchDoc)));
	return (CBmpSearchDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBmpSearchView message handlers

void CBmpSearchView::OnOpensourcefile() 
{
	// TODO: Add your command handler code here
	CClientDC dc(this);
	CString lpszPathName;
	CString comparename;
	CString str;
	double maxsim=-1;
	int picnum=5;

	//int comparenum=1;
	int id;
	CBmpProc *pBmp,*compareBmp;
	CDC *pDC=GetDC();
	double fsim[10];
	static char szFilter[] = "BMP Files(*.BMP)|*.BMP||";

	CFileDialog FileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter );

	if(FileDlg.DoModal()==IDOK)
	{
		InvalidateRect( NULL, TRUE );
		UpdateWindow();
	}
	str.Format("源图片为:");
	dc.TextOut(10,10,str);
   lpszPathName=FileDlg.GetPathName();
    bitmap.LoadFromFile(lpszPathName);
    pBmp = (CBmpProc*)new(CBmpProc);	// 用new分配类目标
	pBmp->LoadFromObject(bitmap, &CRect(0,0,128,128));	// 从指定区域读入图像
	pBmp->Draw(*pDC, &CRect(30,30,168,158));		// 将pBmp中的图像绘入DC的指定区域
	pBmp->SaveToClipboard();			// 将pBmp中的图像保存到剪贴板,保存后类中的图像仍然存在
	pBmp->CalculateColor(*pDC);

	for(int i=0;i<picnum;i++)
	{
		comparename.Format("pic%d.bmp",i+1);
		bitmap.LoadFromFile(comparename);
		compareBmp=(CBmpProc*)new(CBmpProc);
        compareBmp->LoadFromObject(bitmap, &CRect(0,0,128,128));
	//	compareBmp->Draw(*pDC, &CRect(30,20,168,148));			
		compareBmp->CalculateColor(*pDC);
		fsim[i]=CaculatorSim(pBmp,compareBmp);
      //  delete (CBmpProc*)compareBmp;

	}
	
	for(i=0;i<picnum;i++)
	{
		if(fsim[i]>maxsim)
		{
			maxsim=fsim[i];
			id=i+1;
		}
		str.Format("搜索结果为:");
		dc.TextOut(280,30,str);
		str.Format("pic%d相似度为:%.4f",i+1,fsim[i]);
		dc.TextOut(280,60+i*20,str);

	}
   for(int j=0;j<picnum;j++)
   {
	comparename.Format("pic%d.bmp",j+1);
	bitmap.LoadFromFile(comparename);
    compareBmp=(CBmpProc*)new(CBmpProc);
    compareBmp->LoadFromObject(bitmap, &CRect(0,0,128,128));
    compareBmp->Draw(*pDC, &CRect(40+j*128+20,200,168+j*128+20,328));
	str.Format("pic%d",j+1);
	dc.TextOut(40+j*128+20+30,340,str);
    delete (CBmpProc*)compareBmp;
   }


	
}

double CBmpSearchView::CaculatorSim(CBmpProc *p1,CBmpProc *p2) 
{
	double sim=0,finalsim;
	int count=0;
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4;j++)
		{
			for(int k=0;k<256;k++)
			{
				if((p1->Color[i][j][k]>=p2->Color[i][j][k])&&p2->Color[i][j][k]!=0)
				{
					sim+=(1-((fabs(p1->Color[i][j][k]-p2->Color[i][j][k]))/(p1->Color[i][j][k])));
					count++;
				}
				if((p1->Color[i][j][k]<p2->Color[i][j][k])&&p1->Color[i][j][k]!=0)
				{
					sim+=(1-((fabs(p1->Color[i][j][k]-p2->Color[i][j][k]))/(p2->Color[i][j][k])));
					count++;
				}
			}
		}
	}
	if(count>0)
	{
		finalsim=sim/count;
	}
	return finalsim;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -