本帖最后由 happyparrot 于 2009-07-03 13:08:32 编辑

解决方案 »

  1.   

    谢谢!有发现什么问题吗?
    我该在mfc下用cdc倒是可以
    但是为什么在api下不行呢?
      

  2.   

    Matrix = new int*[m]; 
        Matrix [0] = new int[m*n]; 
    这个东东尼在哪里删除了?内存泄漏啊
      

  3.   

    以下是我在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;
    }
    }
      

  4.   

    对比你两段代码:
    Matrix [i][j]=(int)::GetPixel(hdc,i,j);
    应该是Matrix [i][j]=(int)::GetPixel(hdcmen,i,j);
      

  5.   

    you got it
    辛苦你啦!
    但是为什么程序还那么大呢?
    另外,我运行程序总要弹出类似于cmd的一个黑框,有什么办法不弹出来啊?
      

  6.   

    你说的程序是指什么?编译出来的exe么?
    至于弹出cmd,我不知道你是怎样的工程,怎么运行的
      

  7.   

    内存泄露,不知道你这样比较有何意义,和比较文件差不多,那还不如直接一个字一个字比较文件,或者比较文件的sha快的多
      

  8.   

    Matrix = new int*[m]; 
        Matrix [0] = new int[m*n]; 
    你这里new了两个对象。而比较函数中你只是释放的Matrix,而Matrix[0]没有被释放。
      

  9.   

    比方说图像的同一个位置的点,A图是0x123456,B图是0x133355很多点都这样,大致相等,让人去分辨,只会得到基本一样的结论,但你那样比较就明显不同了.人对红绿兰的敏感也不一样的,只能比较大致情况的,绝对相等,除非是同一个文件
      

  10.   

    有个亮度公式I=0.3r+0.59G+.11B你可以试着比较每一像素的R&fC,G&FE,B&FB是否相等,可以得到近似度很近的两副图至少人眼是分辨不出区别的
      

  11.   

    问:在if(Matrix1[i][j]!=Matrix2[i][j])里面。Matrix1[i][j]的第i列里有几个元素,vc的编译器能知道吗?
      

  12.   

    To12楼
    生成的exe文件,运行后弹出一个黑框,标题是我文件的路径
    该怎么去除啊?
    To14楼
    弱问
    R&fC,G&FE,B&FB
    RGB我懂,这个&后的参数是什么东西?
      

  13.   

    文件的大小应该不是new二维数组的关系,我把main函数里的语句都注释了又生成一次
    exe文件还是那么大。
    是我的项目建的有问题?
    我包含的头文件是
    #include "stdafx.h"
    #include "afxwin.h"
      

  14.   

    你build的debug版就较大,release版就较小了.