因此,我试图在给定区域的屏幕中间找到某个模式。我正在使用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;
}