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

부울이 아닌 nullable Point 'Point'를 반환하고 결과를 null로 확인 하시겠습니까? 'Point? p = FindBimap(); 경우 (p.HasValue) {}' – abatishchev

+0

@abatishchev 별로 난 후였다 발견 한 두 번째 비트 맵 ... '경우 (성공 == true)가 { Cursor.Position을 클릭 한 후 = 위치하고있어 ; (두 번째 비트 맵을 클릭하면 해당 스크린 샷을 찾습니다) } ' 정직하게 말하면 나는 현재 갖고있는 것에 만족합니다. 그것이 그것을 발견 두 번째 비트 맵을 클릭 얻으려고 ... – Matt

+0

안녕 Matt. "스크린 샷에서 비트 맵 찾기"라는 설명으로 인해 문제가 있습니다. 비트 맵은 파일 헤더 설명이고 스크린 샷은 이미 파일 이미지 헤더가 필요한 폰의 이미지입니다. 사용자가 두 번 클릭했는지 또는 쉽게 해결할 수있는 두 번째 이미지를 찾았는지 확인하는 방법을 묻고 싶다면 설명 해주십시오. 여기에서 이미지 검색을 사용하여 샘플 프로젝트를 다운로드 할 수 있습니다. 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 비트 맵을 찾으면 두 번째 비트 만 클릭하면됩니다 ... 동일한 비트 맵을 순환 할 수 있기를 원합니다. 당신에게 아이디어를주기위한 원래의 게시물 ... – Matt

+0

글쎄, 내가보기에 - 그것이 코드가 현재하는 것입니다. 첫 번째 비트 맵을 찾으면 건너 뜁니다. 두 번째 비트 맵을 찾으면 위치를 반환합니다. –

+0

나를 위해 일하게하기 위해 약간 편집해야했는데, 고마워요. – Matt