1。我现在要截屏获取两张图片A,B
2。两张图片获取后要比较这两张图片的不同之处
3。比较完后要在屏幕上显示出A或者B,然后另外显示一张有明显区别的图片 C。
C这张图片是经过两张图片比较后绘出的。
我现在截屏的代码如下,不知道下面该怎么去处理,恳请各位高手指点:
//获取图片
void GetPicture(HDC hScrDC, LPRECT lpRect)
{
// 屏幕和内存设备描述表
HDC hMemDC;
    // 位图句柄
HBITMAP hBitmap,hOldBitmap;
// 选定区域坐标
int nX, nY, nX2, nY2;
    // 位图宽度和高度
int nWidth, nHeight;
// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
    return ;
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
//为指定设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 创建一个与指定设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
    // 把屏幕设备描述表拷贝到内存设备描述表中
StretchBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
   //
CBitmap *pBitmap;
pBitmap=NULL;
pBitmap=CBitmap::FromHandle(hBitmap);      int nCX=pBitmap->GetBitmapDimension().cx;
int nCY=pBitmap->GetBitmapDimension().cy;
LONG lSize=(LONG)nCX*nCY;
::GetBitmapBits(hBitmap,lSize,szPictureInfo); //清除
DeleteDC(hMemDC);
     DeleteObject(hOldBitmap);}

解决方案 »

  1.   

    我做过这个外挂,也是用图像对比来做的,看看我的文章:http://blog.long1986.com/blog/20080517168/using-vc-opencv-to-write-everyone-to-finding-fault-plug-in.html
      

  2.   

    这个很简单呀.循环比较一下得到的图片buf,不同的地方,就把它的的值设为RBG的值,色你随便挑,相同的就设为白色的RBG的值,然后保存这个比较完的Buf,转成BMP格式信息,再显示出来就OK了.
      

  3.   

    是如何取出图片的信息,如何进行异或?各位高手们请指点详细些吧,给个链接和一段代码都可以?苦苦等待中!!!
    是下面这么取图片信息吗?
    char szPictureInfo[3072];
    ::GetBitmapBits(hBitmap,lSize,szPictureInfo);
      

  4.   

    这个方法就是取位图数据
    取出两个图的数据比如分别是szPictureInfo和szPictureInfo1
    那么异或就是
    for(int i=0; i<3072; i++)
    {
        szPictureInfo3 = szPictureInfo[i]^szPictureInfo1[i];
    }然后通过SetBitmapBits把szPictureInfo3赋给第三张图
      

  5.   

    图像比对:先进行预处理、提取角点、做变换、二值化、比对
    http://blog.csdn.net/fengbingchun/category/694197.aspx
      

  6.   

    详细的解答还要自己尝试
    呵呵
    你试试PrintWindow这个函数
    具体用法详见MSDN