2017-10-03 13 views
11

Próbuję znaleźć określony wzór na środku ekranu w danym obszarze. Używam biblioteki AutoItX i metody PixelSearch.PixelWyszukiwanie w pewnym obszarze monitora

  • prostokątna X: 1980
  • prostokątna Y: 630
  • prostokątna Rozmiar X: 1240
  • prostokątna Rozmiar Y: 180

To nie wraca, że ​​wzór został znaleziony, ale jeśli ustawię sznury prostokąta na 0, 0, pokaże się, że wzór został znaleziony.

następujący skrypt używany:

public void MonsterScan() 
    { 
    if(SixStarMax() == true) 
    { 
     Console.WriteLine("Pattern found"); 
    } 
    } 

    public bool SixStarMax() 
    { 
    Rectangle rect = new Rectangle(1980, 630, 1240, 180); 
    autoSumPoint = AutoItX.PixelSearch(rect, 0xF8F0E0); // 0xF8F0E0 
    autoSumPoint2 = AutoItX.PixelSearch(rect, 0xB7AD9F); // 0xB7AD9F 
    autoSumPoint3 = AutoItX.PixelSearch(rect, 0xCDC6B8); // 0xCDC6B8 
    autoSumPoint4 = AutoItX.PixelSearch(rect, 0x949084); // 0x949084 

    if (rect.Contains(autoSumPoint2) == true && rect.Contains(autoSumPoint2) == true && rect.Contains(autoSumPoint3) == true && rect.Contains(autoSumPoint4) == true) 
    { 
     AutoItX.MouseMove(autoSumPoint.X, autoSumPoint.Y); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
    } 

Edit:

Próbował dostosować cordinates do mojego pierwszego ekranu i pojawia się błąd rzucony.

System.AccessViolationException: 'An attempt was made to read or write to protected memory. This often indicates that other memory is damaged. ' 
+1

Błąd podobny do tego AccessViolationException pochodzi z natywnej części AutoIt (nie z opakowania .net). Powinieneś spróbować skontaktować się z twórcą AutoIt. –

Odpowiedz

3

AutoItX”PixelSearch() ma a bug. Możliwe rozwiązania:

  • Sprawdź, czy zostało naprawione w latest beta.
  • Zmiana współrzędnych (poprzednia wersja miała włączoną X/Y).
  • Użyj PixelGetColor().
  • Znajdź stronę trzecią image search dll.
+0

Rozwiązanie, które zasugerowałeś: "Znajdź bibliotekę wyszukiwania obrazu innej firmy". Zgaduję, że potrzebuję zespołu, aby działał w .net? Domyślam się, że imagesearch.dll nie działa? – Tweath

0

Można go zakodować bez zewnętrznej biblioteki i bardzo szybko, czytając bajty wewnętrznie. Nie zapomnij włączyć System.Drawing.Imaging i System.Linq do instrukcji użycia i skompilować je z opcją "Niebezpieczne" w Opcjach projektu.

public bool SixStarMax() 
{ 
    Rectangle rect = new Rectangle(1980, 630, 1240, 180); 

    Bitmap bitmapToScan = GetScreenPart(rect); 

    Point?[] autoSumPoints = new Point?[4]; 

    autoSumPoints[0] = SearchForColor(bitmapToScan, 0xF8F0E0); 
    autoSumPoints[1] = SearchForColor(bitmapToScan, 0xB7AD9F); 
    autoSumPoints[2] = SearchForColor(bitmapToScan, 0xCDC6B8); 
    autoSumPoints[3] = SearchForColor(bitmapToScan, 0x949084); 

    //return true if all points return a value 
    bool containsAll = autoSumPoints.All(p => p.HasValue); 

    if (containsAll) Cursor.Position = autoSumPoints[0].Value; 
    return containsAll; 
} 

public Bitmap GetScreenPart(Rectangle rect) 
{ 
    //initialize bitmap 
    Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 

    //fill bitmap 
    using (Graphics g = Graphics.FromImage(bmp)) 
     g.CopyFromScreen(new Point(rect.Left, rect.Top), new Point(rect.Right, rect.Bottom), rect.Size); 

    return bmp; 
} 

public Point? SearchForColor(Bitmap image, uint color) 
{ 
    Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); 

    BitmapData data = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb); 

    //works for 32-bit pixel format only 
    int ymin = rect.Top, ymax = Math.Min(rect.Bottom, image.Height); 
    int xmin = rect.Left, xmax = Math.Max(rect.Right, image.Width) - 1; 

    int strideInPixels = data.Stride/4; //4 bytes per pixel 
    unsafe 
    { 
     uint* dataPointer = (uint*)data.Scan0; 
     for (int y = ymin; y < ymax; y++) 
      for (int x = xmin; x < xmax; x++) 
      { 
       //works independently of the data.Stride sign 
       uint* pixelPointer = dataPointer + y * strideInPixels + x; 
       uint pixel = *pixelPointer; 
       bool found = pixel == color; 
       if (found) 
       { 

        image.UnlockBits(data); 
        return new Point(x, y); 

       } 
      } 
    } 
    image.UnlockBits(data); 
    return null; 
} 
Powiązane problemy