2016-07-23 6 views
1

У меня есть обрезанная версия изображения, которое должно появиться на моем экране.C# Проверьте, отображается ли изображение на экране

Image 6Island = Image.FromFile("C:\\Users\\6Island.png");

Теперь следующая цель состоит в том, чтобы сделать снимок экрана.

Bitmap CaptureScreen() 
    { 
     var image = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); 
     var gfx = Graphics.FromImage(image); 
     gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); 
     return image; 
    } 

Image 6Island = Image.FromFile("C:\\Users\\6Island.png"); 
Image currentView = CaptureScreen(); 

Затем я хочу, чтобы увидеть, если я могу найти изображение 6Island внутри нового изображения. И цвета могут немного отличаться. Есть ли способ сделать это?

+0

Сравнить это пиксель за пикселем –

+0

@x ... Как вы предлагаете мне это делать? – Dgameman1

+0

объясните, что подразумевается под «6Island внутри нового изображения», какова логика, которую вы хотите применить с точки зрения методов обработки изображений. –

ответ

1

Это просто быстрый и грязный образец, но он работает. Этот код делает «обрезку» вашего большого растрового изображения и сравнивает его с вашим небольшим растровым изображением. Если равно, то процент должен быть равен 100, если неравномерно, то процент ниже этого. Я бы сказал, если больше 98%, то вы его нашли.

private static void CompareBigAndSmallBitmaps(string fileName1, string fileName2) 
{ 
    var bmpBig = (Bitmap) Image.FromFile(fileName1); 
    var bmpSmall = (Bitmap) Image.FromFile(fileName2); 
    for (var offX = 0; offX < bmpBig.Width - bmpSmall.Width; offX++) 
    { 
    for (var offY = 0; offY < bmpBig.Height - bmpSmall.Height; offY++) 
    { 
     var percentage = CompareSmallBitmaps(bmpBig, bmpSmall, offX, offY); 
     if (percentage > 98.0) // define percentage of equality 
     { 
     // Aha... found something here....and exit here if you want 
     } 
    } 
    } 
} 

private static double CompareSmallBitmaps(Bitmap bmpBig, Bitmap bmpSmall, int offX, int offY) 
{ 
    var equals = 0; 
    for (var x = 0; x < bmpSmall.Width; x++) 
    { 
    for (var y = 0; y < bmpSmall.Height; y++) 
    { 
     var color1 = bmpBig.GetPixel(x + offX, y + offY).ToArgb(); 
     var color2 = bmpSmall.GetPixel(x, y).ToArgb(); 
     if (color1 == color2) 
     { 
     equals++; 
     } 
    } 
    } 
    return (Convert.ToDouble(equals)/Convert.ToDouble(bmpSmall.Width*bmpSmall.Height))*100.0; 
} 
+0

_if (color1 == color2) _ это не будет работать, поскольку цвета могут немного отличаться, как указано в op. Требуется либо функция цветового расстояния с помощью epsilon, либо простое усечение: сдвиньте каждый канал вправо на 1-4 пикселя и сравните усеченные цвета. – TaW

Смежные вопросы