写了个比较两幅图像异同的程序,怎么比较得结果不对呢? 本帖最后由 happyparrot 于 2009-07-03 13:08:32 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谢谢!有发现什么问题吗?我该在mfc下用cdc倒是可以但是为什么在api下不行呢? Matrix = new int*[m]; Matrix [0] = new int[m*n]; 这个东东尼在哪里删除了?内存泄漏啊 以下是我在mfc下写的,用了一个button操作执行,得出的结果是“same”void CbitmapDlg::BitmapToMatrix(HBITMAP hBitmap){ CDC dc; CBitmap bmp; CDC *pDC=GetDC(); bmp.Attach(hBitmap); BITMAP bwh; bmp.GetObject(sizeof(BITMAP),&bwh); dc.CreateCompatibleDC(pDC); dc.SelectObject(&bmp); int m,n; m=bwh.bmHeight; n=bwh.bmWidth;//行,列 Matrix [0] = new int[m*n]; for(int i = 1; i < m; i++) Matrix [i] = Matrix[i-1]+n; for(int i=0;i<bwh.bmHeight;i++) { for(int j=0;j<bwh.bmWidth;j++) { Matrix [i][j]=(int)dc.GetPixel(i,j); } } bmp.Detach(); ReleaseDC(pDC);}BOOL CbitmapDlg::PictureSame(HBITMAP hbitmap1, HBITMAP hbitmap2){ BOOL bSame = true; CBitmap bmp1,bmp2; BITMAP bwh1,bwh2; bmp1.Attach(hBitmap1); bmp1.GetObject(sizeof(BITMAP),&bwh1); bmp2.Attach(hBitmap2); bmp2.GetObject(sizeof(BITMAP),&bwh2); BitmapToMatrix(hBitmap1); int** Matrix1=Matrix; BitmapToMatrix(hBitmap2); int** Matrix2=Matrix; if(bwh1.bmWidth==bwh2.bmWidth&&bwh1.bmHeight==bwh2.bmHeight) { for(int i=0;i<bwh1.bmHeight&& bSame;i++) { for(int j=0;j<bwh1.bmWidth ;j++) { if(Matrix1[i][j]!=Matrix2[i][j]) { bSame=false; break; } } } } delete [] Matrix1; delete [] Matrix2; return bSame; }void CbitmapDlg::OnBnClickedButtonCp(){ // TODO: 在此添加控件通知处理程序代码 hBitmap1=(HBITMAP)LoadImage(NULL,"c:\\test1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION); hBitmap2=(HBITMAP)LoadImage(NULL,"c:\\test1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION); BOOL bSame=PictureSame(hBitmap1,hBitmap2); if(bSame) { MessageBox(_T("Same"),_T("Compare"),MB_OK); return; } else { MessageBox(_T("Different"),_T("Compare"),MB_OK); return; } } 对比你两段代码:Matrix [i][j]=(int)::GetPixel(hdc,i,j);应该是Matrix [i][j]=(int)::GetPixel(hdcmen,i,j); you got it辛苦你啦!但是为什么程序还那么大呢?另外,我运行程序总要弹出类似于cmd的一个黑框,有什么办法不弹出来啊? 你说的程序是指什么?编译出来的exe么?至于弹出cmd,我不知道你是怎样的工程,怎么运行的 内存泄露,不知道你这样比较有何意义,和比较文件差不多,那还不如直接一个字一个字比较文件,或者比较文件的sha快的多 Matrix = new int*[m]; Matrix [0] = new int[m*n]; 你这里new了两个对象。而比较函数中你只是释放的Matrix,而Matrix[0]没有被释放。 比方说图像的同一个位置的点,A图是0x123456,B图是0x133355很多点都这样,大致相等,让人去分辨,只会得到基本一样的结论,但你那样比较就明显不同了.人对红绿兰的敏感也不一样的,只能比较大致情况的,绝对相等,除非是同一个文件 有个亮度公式I=0.3r+0.59G+.11B你可以试着比较每一像素的R&fC,G&FE,B&FB是否相等,可以得到近似度很近的两副图至少人眼是分辨不出区别的 问:在if(Matrix1[i][j]!=Matrix2[i][j])里面。Matrix1[i][j]的第i列里有几个元素,vc的编译器能知道吗? To12楼生成的exe文件,运行后弹出一个黑框,标题是我文件的路径该怎么去除啊?To14楼弱问R&fC,G&FE,B&FBRGB我懂,这个&后的参数是什么东西? 文件的大小应该不是new二维数组的关系,我把main函数里的语句都注释了又生成一次exe文件还是那么大。是我的项目建的有问题?我包含的头文件是#include "stdafx.h"#include "afxwin.h" 你build的debug版就较大,release版就较小了. 新鲜热乎的“超音速启动-QStart”,欢迎大家拍砖 关于VC绘制曲线的问题 关于CFileDialog打开局域网共享文件的问题(急) 我见过的最无耻的人 服务器数据库连接设计的问题,还有访问方式的问题,高手进来坐坐 一个easy的问题! 关于Mutilple Document工程中的ToolBar的显示 打包使用Access的VC程序 用过VS2005编写动态链接库的请进 加密软件封掉了网口、U口,怎么破开 急!急!急! picture控件与edit控件问题 请问这段代码debug的unicode为什么不能捕获住异常?
我该在mfc下用cdc倒是可以
但是为什么在api下不行呢?
Matrix [0] = new int[m*n];
这个东东尼在哪里删除了?内存泄漏啊
void CbitmapDlg::BitmapToMatrix(HBITMAP hBitmap)
{
CDC dc;
CBitmap bmp;
CDC *pDC=GetDC();
bmp.Attach(hBitmap);
BITMAP bwh;
bmp.GetObject(sizeof(BITMAP),&bwh);
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&bmp);
int m,n;
m=bwh.bmHeight;
n=bwh.bmWidth;//行,列
Matrix [0] = new int[m*n];
for(int i = 1; i < m; i++)
Matrix [i] = Matrix[i-1]+n;
for(int i=0;i<bwh.bmHeight;i++)
{
for(int j=0;j<bwh.bmWidth;j++)
{
Matrix [i][j]=(int)dc.GetPixel(i,j);
}
} bmp.Detach();
ReleaseDC(pDC);}BOOL CbitmapDlg::PictureSame(HBITMAP hbitmap1, HBITMAP hbitmap2)
{
BOOL bSame = true;
CBitmap bmp1,bmp2;
BITMAP bwh1,bwh2;
bmp1.Attach(hBitmap1);
bmp1.GetObject(sizeof(BITMAP),&bwh1);
bmp2.Attach(hBitmap2);
bmp2.GetObject(sizeof(BITMAP),&bwh2);
BitmapToMatrix(hBitmap1);
int** Matrix1=Matrix;
BitmapToMatrix(hBitmap2);
int** Matrix2=Matrix;
if(bwh1.bmWidth==bwh2.bmWidth&&bwh1.bmHeight==bwh2.bmHeight)
{
for(int i=0;i<bwh1.bmHeight&& bSame;i++)
{
for(int j=0;j<bwh1.bmWidth ;j++)
{
if(Matrix1[i][j]!=Matrix2[i][j])
{
bSame=false;
break;
}
}
}
}
delete [] Matrix1;
delete [] Matrix2;
return bSame;
}void CbitmapDlg::OnBnClickedButtonCp()
{
// TODO: 在此添加控件通知处理程序代码
hBitmap1=(HBITMAP)LoadImage(NULL,"c:\\test1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);
hBitmap2=(HBITMAP)LoadImage(NULL,"c:\\test1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);
BOOL bSame=PictureSame(hBitmap1,hBitmap2);
if(bSame)
{
MessageBox(_T("Same"),_T("Compare"),MB_OK);
return;
}
else
{
MessageBox(_T("Different"),_T("Compare"),MB_OK);
return;
}
}
Matrix [i][j]=(int)::GetPixel(hdc,i,j);
应该是Matrix [i][j]=(int)::GetPixel(hdcmen,i,j);
辛苦你啦!
但是为什么程序还那么大呢?
另外,我运行程序总要弹出类似于cmd的一个黑框,有什么办法不弹出来啊?
至于弹出cmd,我不知道你是怎样的工程,怎么运行的
Matrix [0] = new int[m*n];
你这里new了两个对象。而比较函数中你只是释放的Matrix,而Matrix[0]没有被释放。
生成的exe文件,运行后弹出一个黑框,标题是我文件的路径
该怎么去除啊?
To14楼
弱问
R&fC,G&FE,B&FB
RGB我懂,这个&后的参数是什么东西?
exe文件还是那么大。
是我的项目建的有问题?
我包含的头文件是
#include "stdafx.h"
#include "afxwin.h"