2012-04-03 133 views
0

我目前有一个代码,它将在该程序截图中搜索位图,但是,位图在截图中存在三次,我希望它在第二次找到它时单击。位图检测

有没有办法做到这一点?提前很多感谢的......

代码:

private Bitmap Screenshot() 
{ 
    Bitmap bmpScreenShot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
    Graphics g = Graphics.FromImage(bmpScreenShot); 
    g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size); 
    return bmpScreenShot; 
} 

private bool FindBitmap(Bitmap BmpNeedle, Bitmap BmpHaystack, out Point location) 
{ 
    for (int outerX = 0; outerX < BmpHaystack.Width - BmpNeedle.Width; outerX++) 
    { 
     for (int outerY = 0; outerY < BmpHaystack.Height - BmpNeedle.Height; outerY++) 
     { 
      for (int innerX = 0; innerX < BmpNeedle.Width; innerX++) 
      { 
       for (int innerY = 0; innerY < BmpNeedle.Height; innerY++) 
       { 
        Color cNeedle = BmpNeedle.GetPixel(innerX, innerY); 
        Color cHaystack = BmpHaystack.GetPixel(innerX + outerX, innerY + outerY); 
        if (cNeedle.R != cHaystack.R || cNeedle.G != cHaystack.G || cNeedle.B != cHaystack.B) 
        { 
         continue; 
        } 
       } 
      } 
      location = new Point(outerX, outerY); 
      return true; 
     } 
    } 
    location = Point.Empty; 
    return false; 
} 

public void findImage() 
{ 
    Bitmap bmpScreenshot = Screenshot(); 
    Point location; 
    bool success = FindBitmap(Properties.Resources.xxx, bmpScreenshot, out location); 
} 

不知道是不是真的有帮助,我想要它做的就是点击它找到了第二位。

一位朋友确实建议将我的屏幕截图分割成网格,并做到这一点,为什么要做网格的路要走,还是有可能找到第二个位图?

更新:假设我的屏幕上有5个完全相同的图像。我想让我的程序点击找到的第三个位图。

+0

难道你不想返回可为null的Point'Point?',而不是布尔值,并检查结果是否为null:'Point? p = FindBimap();如果(p.HasValue){}' – abatishchev 2012-04-03 06:02:55

+0

@abatishchev 不是真的我后,是点击它找到了第二位...... '如果(成功==真){ Cursor.Position后=位置; (点击它在屏幕截图中找到的第二个位图) }' 诚实地说,我很满意现在所拥有的。试图让它第二次找到它时点击位图... – Matt 2012-04-03 06:05:43

+0

嗨马特。我通过描述“在屏幕截图中查找位图”遇到问题。位图是文件头描述,屏幕截图是手机中的任何图像,因为我看到哪些图像头已经需要任何文件图像头。如果您想问如何确定用户是否点击了两次或检测到可轻松解决的第二张图片。请解释。在这里你可以下载一个带有图像检测的示例项目:http://www.activevb.de/rubriken/kolumne/kol_30/wp7_einfuehrung.html – Nasenbaer 2012-04-03 06:22:49

回答

0

最简单的方法就是引入一个显示图片被找到的次数的计数器。不知怎的,像这样:

private bool FindBitmap(Bitmap BmpNeedle, Bitmap BmpHaystack, out Point location) 
{ 
    int countTimesFound = 0; 
    for (int outerX = 0; outerX < BmpHaystack.Width - BmpNeedle.Width; outerX++) 
    { 
     for (int outerY = 0; outerY < BmpHaystack.Height - BmpNeedle.Height; outerY++) 
     { 
      for (int innerX = 0; innerX < BmpNeedle.Width; innerX++) 
      { 
       for (int innerY = 0; innerY < BmpNeedle.Height; innerY++) 
       { 
        Color cNeedle = BmpNeedle.GetPixel(innerX, innerY); 
        Color cHaystack = BmpHaystack.GetPixel(innerX + outerX, innerY + outerY); 
        if (cNeedle.R != cHaystack.R || cNeedle.G != cHaystack.G || cNeedle.B != cHaystack.B) 
        { 
         continue; 
        } 
       } 
      } 
      countTimesFound++; 
      if (countTimesFound == 2) 
      { 
       location = new Point(outerX, outerY); 
       return true; 
      } 
     } 
    } 
    location = Point.Empty; 
    return false; 
} 

虽然你应该真的看看图像检测技术。有些库可以让这样做更容易。

+0

Eugh,抱歉我可能应该提到...如果它发现3位图,我只希望它点击第二个... 我希望它能够循环通过相同的位图...我会编辑我的原来的帖子给你一个想法... – Matt 2012-04-03 06:55:34

+0

好吧,正如我所看到的那样 - 这就是目前的代码。当它找到第一个位图时,它会跳过。当它找到第二个位图时 - 它返回它的位置。 – 2012-04-03 06:57:48

+0

不得不编辑它让它为我工作,谢谢很多队友! – Matt 2012-04-03 07:22:07