Pixelsearch在某些显示器中



因此,我试图在给定区域的屏幕中间找到某个模式。我正在使用AutoItX库和PixelSearch方法。

  • 矩形X:1980
  • 矩形Y:630
  • 矩形尺寸x:1240
  • 矩形尺寸y:180

没有发现该图案,但是如果我将矩形的绳索调整为 0, 0,则表明已经找到了图案。

使用以下脚本:

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

编辑:

试图将绳索调整到我的第一个屏幕上,然后丢了一个错误。

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

autoItx' PixelSearch()有一个错误。可能的解决方案:

  • 看看它是否已修复在最新beta中。
  • 更改坐标(一个旧版本已切换X/Y)。
  • 使用PixelGetColor()
  • 找到第三方图像搜索dll。

您可以无需任何外部库编码即可编码,并且可以通过内部读取字节非常快。不要忘记将System.Drawing.Imaging和System.Linq包括在使用语句中,并在项目选项中使用"不安全"选项编译。

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

相关内容

  • 没有找到相关文章

最新更新