代码之家  ›  专栏  ›  技术社区  ›  Mr J

让这个简单的c#图像搜索代码更快?

  •  -2
  • Mr J  · 技术社区  · 6 年前

    我传入两个位图,一个是按钮的图片,另一个是屏幕截图。

    有没有什么方法可以加快这个基本方法的速度?

    private PositionToClick IsInCapture(Bitmap searchFor, Bitmap searchIn)
    {
        for (int x = 0; x < searchIn.Width; x++)
        {
            for (int y = 0; y < searchIn.Height; y++)
            {
                bool invalid = false;
                int k = x, l = y;
                for (int a = 0; a < searchFor.Width; a++)
                {
                    l = y;
                    for (int b = 0; b < searchFor.Height; b++)
                    {
                        if (searchFor.GetPixel(a, b) != searchIn.GetPixel(k, l))
                        {
                            invalid = true;
                            break;
                        }
                        else
                            l++;
                    }
                    if (invalid)
                        break;
                    else
                        k++;
                }
    
                if (!invalid)
                    return new PositionToClick() { X = x, Y = y, found = true };
            }
        }
    
        return new PositionToClick();
    }
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Bart van der Drift    6 年前

    您可以先将位图转换为字节数组,然后比较这些数组。 我没有测试下面的代码,它只是我的意思的一个说明。

    private PositionToClick IsInCapture(Bitmap searchFor, Bitmap searchIn)
    {
        var searchForArray = ImageToByte2(searchFor);
        var searchInArray = ImageToByte2(searchIn);
        for (int x = 0; x <= searchIn.Width - searchFor.Width; x++)
        {
            for (int y = 0; y <= searchIn.Height - searchFor.Height; y++)
            {
                bool invalid = false;
                int k = x, l = y;
                for (int a = 0; a < searchFor.Width; a++)
                {
                    l = y;
                    for (int b = 0; b < searchFor.Height; b++)
                    {
                        var pixelFor = searchForArray[a * searchFor.Width + b];
                        var pixelIn = searchInArray[k + searchIn.Width + l];
                        if (pixelIn != pixelFor)
                        {
                            invalid = true;
                            break;
                        }
                        else
                            l++;
                    }
                    if (invalid)
                        break;
                    else
                        k++;
                }
    
                if (!invalid)
                    return new PositionToClick() { X = x, Y = y, found = true };
            }
        }
        return new PositionToClick();
    }
    
    public static byte[] ImageToByte2(Image img)
    {
        using (var stream = new MemoryStream())
        {
            img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
            return stream.ToArray();
        }
    }