У меня есть образец изображения размером 60x60, и я пытаюсь найти этот образец на увеличенном снимке экрана (размером 1920x1080).
Моя проблема в том, что хотя образец виден на скриншоте и помещен правильно, я не могу его обнаружить из-за незначительных цветовых различий. Как видно из приведенного ниже кода, пиксели не равны, но они действительно близки по цвету (около 0,10 в разнице оттенков). В этом случае между этими двумя значениями должно быть различие в качестве, поскольку оба растровых изображения имеют одинаковый формат Format32bppArgb
.
Метод, который я использую для захвата экрана:
private static Bitmap Screenshot(int x, int y, int width, int height)
{
var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
using (var g = Graphics.FromImage(bmp))
{
g.CopyFromScreen(x, y, 0, 0, bmp.Size);
return bmp;
}
}
Вот как я делаю сравнения:
private static void Main(string[] args)
{
// Load a sample
var sample = (Bitmap)Image.FromFile("sample.png");
// Capture screen frame
var screenshot = Screenshot(0, 0, 1920, 1080);
// Get first pixel in a sample
var firstPixel = sample.GetPixel(0, 0);
// Get same pixel in the screenshot
// sample position first pixel is at 1590x500
var targetPixel = screenshot.GetPixel(1590, 500);
// Compare pixels
var equal = firstPixel.ToArgb() == targetPixel.ToArgb(); // This fails!
// Get hue levels
var sourcePixHue = firstPixel.GetHue();
var targetPixHue = targetPixel.GetHue();
// Result: a tiny difference
// sourcePixHue = 12.3076925
// targetPixHue = 12.4137926
}
Мои вопросы:
- Какова лучшая практика, формат изображения для сравнения двух растровых пикселей, чтобы они были равны?
- Как правильно подготовить образец растрового изображения, чтобы "преодолеть" разницу в качестве / цвете с растровым изображением на скриншоте?