好象CDib类,没有统一自定义
建议用两个HDIB,得到各自指向hdib内存块的指针
这就好办了,移动指针挨个像素比 

解决方案 »

  1.   

    给你一段代码:
    // 获取文档
    CCh1_1Doc* pDoc = GetDocument();

    // 指向DIB的指针
    LPSTR lpDIB,lpTemplateDIB; // 指向DIB象素指针
    LPSTR    lpDIBBits,lpTemplateDIBBits;

    //图像的宽度与高度
    long lWidth,lHeight; //模板的宽度与高度
    long lTemplateWidth,lTemplateHeight; HDIB hTemplateDIB; // 锁定DIB
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());


    // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
    if (::DIBNumColors(lpDIB) != 256)
    {
    // 提示用户
    MessageBox("目前只支持256色位图的平移!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定
    ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

    // 返回
    return;
    }


    // 更改光标形状
    BeginWaitCursor(); // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIB);

    lWidth = ::DIBWidth(lpDIB);
    lHeight = ::DIBHeight(lpDIB);
    CFileDialog dlg(TRUE,"bmp","*.bmp");
    if(dlg.DoModal() == IDOK)
    {
     
      CFile file;
      CFileException fe;
     
      CString strPathName;
     
    strPathName = dlg.GetPathName();
     
    // 打开文件
    VERIFY(file.Open(strPathName, CFile::modeRead | CFile::shareDenyWrite, &fe)); // 尝试调用ReadDIBFile()读取图像
    TRY
    {
      hTemplateDIB = ::ReadDIBFile(file);
    }
    CATCH (CFileException, eLoad)
    {
    // 读取失败
      file.Abort();
     
    // 恢复光标形状
    EndWaitCursor();
     
    // 报告失败
    //ReportSaveLoadException(strPathName, eLoad,
    // FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);

    // 设置DIB为空
    hTemplateDIB = NULL;

    // 返回
    return;
    }
    END_CATCH
     
    // 初始化DIB
    //InitDIBData();
     
    // 判断读取文件是否成功
    if (hTemplateDIB == NULL)
    {
      // 失败,可能非BMP格式
      CString strMsg;
      strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
     
      // 提示出错
      MessageBox(strMsg, NULL, MB_ICONINFORMATION | MB_OK);
      
      // 恢复光标形状
      EndWaitCursor();
     
      // 返回
      return;
      }
      }
    else
    {
      // 恢复光标形状
      EndWaitCursor(); return;
    }
    // 锁定DIB
    lpTemplateDIB = (LPSTR) ::GlobalLock((HGLOBAL) hTemplateDIB);

    // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的模板匹配,其它的可以类推)
    if (::DIBNumColors(lpTemplateDIB) != 256)
    {
    // 提示用户
    MessageBox("目前只支持256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定
    ::GlobalUnlock((HGLOBAL) hTemplateDIB);

    // 返回
    return;
    }


    // 更改光标形状
    BeginWaitCursor(); // 找到DIB图像象素起始位置
    lpTemplateDIBBits = ::FindDIBBits(lpTemplateDIB);

    lTemplateWidth = ::DIBWidth(lpTemplateDIB);
    lTemplateHeight = ::DIBHeight(lpTemplateDIB);
    if(lTemplateHeight > lHeight || lTemplateWidth > lWidth )
    {
    // 提示用户
    MessageBox("模板尺寸大于源图像尺寸!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定
    ::GlobalUnlock((HGLOBAL) hTemplateDIB);

    // 返回
    return; }
    // 调用TemplateMatchDIB()函数进行模板匹配
    if (TemplateMatchDIB(lpDIBBits,lpTemplateDIBBits, lWidth,lHeight, lTemplateWidth,lTemplateHeight))
    {

    // 设置脏标记
    pDoc->SetModifiedFlag(TRUE); // 更新视图
    pDoc->UpdateAllViews(NULL);
    }
    else
    {
    // 提示用户
    MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
    }

    // 解除锁定
    ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
    ::GlobalUnlock((HGLOBAL) hTemplateDIB); // 恢复光标
    EndWaitCursor();
      

  2.   

    是一个样卡(没有填涂的)
    一个填涂的学生卡进行比较提取出学生的准考证号和题号及选项形成文本文件或是存在数组里,传给数据库,与其中的正确的信息相比较,得出最后的得分。
    老师规定用CDIB类