2012-04-03 6 views
0

私は現在、このプログラムで撮影したスクリーンショットでビットマップを検索するコードを持っていますが、ビットマップはスクリーンショットに3回存在し、2回目にクリックします。ビットマップ検出

これを行う方法はありますか?事前のおかげで多くの...

コード:それは本当に私はそれがやりたいすべてはそれが見つけた第二のビットマップをクリックしている、場合に役立ちます

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); 
} 

知ってはいけません。

友人は私のスクリーンショットをグリッドに分割し、グリッドを行く方法をやっているのか、それとも2番目のビットマップを見つけることができるのでしょうか?

更新:画面に全く同じ画像が5つあるとします。プログラムが見つけた3番目のビットマップをクリックします。

+0

nullableポイント「Point?」を返し、ブール値ではなく、結果をnullでチェックしたくありません。 p = FindBimap();本当に(p.HasValue){} ' – abatishchev

+0

@abatishchev ない私が後だものを、第二のビットマップをクリックした後、それは... '場合(成功== true)を { Cursor.Position =場所発見した場合; (これは、2番目のビットマップをクリックすると、スクリーンショットが見つかる) } ' すべての正直なところ、私は現時点でのことに満足している。ビットマップを2回目にクリックしようとすると、それが見つかった... – Matt

+0

こんにちはマット。私は、「スクリーンショットでビットマップを見つける」という記述によって問題を抱えています。ビットマップはファイルヘッダの説明であり、スクリーンショットは電話からの任意のイメージで、すでにファイルイメージのヘッダが必要なイメージです。ユーザーが2回クリックしたかどうか、または簡単に解決できる2番目の画像が検出されたかどうかを確認する方法を尋ねたい場合。説明してください。ここでは、画像検出機能を備えたサンプルプロジェクトをダウンロードできます。http://www.activevb.de/rubriken/kolumne/kol_30/wp7_einfuehrung.html – Nasenbaer

答えて

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つのビットマップが見つかったら、それは2番目のものをクリックしたいだけです... 同じビットマップを循環できるようにしたい...私は私のあなたにアイデアを伝えるオリジナルの投稿... – Matt

+0

私はそれを見ています - それは現在のコードです。最初のビットマップが見つかるとスキップします。 2番目のビットマップを見つけると、それはその場所を返します。 –

+0

それは私のために働くために少し編集する必要がありました、ありがとうたくさんの仲間! – Matt

関連する問題