2015-07-25 2 views
1

Я использую эти функции ниже, чтобы сделать снимок экрана с экрана пользователя и сравнить этот снимок экрана с изображением bmpTest, который находится в ресурсах. Если находит что-то совместимое с , bmpTest возвращает его местоположение.Снимок экрана и сравнение изображений

Моя проблема: этот алгоритм используется немного медленно и занимает около 10-15 секунд интерпретировать изображение и дать результат. Кто-нибудь из вас знает другой метод, который делает то же самое, но быстрее? И, может быть, некоторые% сходства? Я просто не мог найти в Интернете.

 private Bitmap Screenshot() 
    { 
     // this is where we will store a snapshot of the screen 
     Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 

     // creates a graphics object so we can draw the screen in the bitmap (bmpScreenshot) 
     Graphics g = Graphics.FromImage(bmpScreenshot); 

     // copy from screen into the bitmap we created 
     g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size); 

     //g.CopyFromScreen(205, 179, 660, 241, new Size(455, 62)); 

     // return the screenshot 
     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) 
         { 
          goto notFound; 
         } 
        } 
       } 
       location = new Point(outerX, outerY); 
       return true; 
      notFound: 
       continue; 
      } 
     } 
     location = Point.Empty; 
     return false; 
    } 



    private void button8_Click_1(object sender, EventArgs e) 
    { 
     // takes a snapshot of the screen 
     Bitmap bmpScreenshot = Screenshot(); 

     // find the login button and check if it exists 
     Point location; 
     bool success = FindBitmap(Properties.Resources.bmpTest, bmpScreenshot, out location); 

     // check if it found the bitmap 
     if (success == false) 
     { 
      MessageBox.Show("Not Found"); 
      return; 
     } 
     else 
     { 
      MessageBox.Show("Image Found"); 
     }    
    } 
+0

Вместо Get-SetPixel вы должны использовать LockBits для такого анализа. См. [Здесь] (http://stackoverflow.com/questions/26224095/how-to-find-the-difference-between-two-images/26225153?s=8|0.3123#26225153) для примера. – TaW

ответ

0

Это происходит потому, что каждый вызов «GetPixel» в растровом объекте выполняет блокировку, вызывающую проблему с производительностью.

Вы можете получить лучшую производительность, имея дело с блокировкой самостоятельно, так что вы можете заблокировать всю растровую карту один раз, в вашем случае как растровые изображения, так и затем перебирать пиксели.

Check out the code example by Vano Maisuradze

Смежные вопросы