2012-04-03 101 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