2016-07-23 90 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

它比較逐像素 – 2016-07-23 03:53:58

+0

@x ......你怎麼建議我做什麼呢? – Dgameman1

+0

解釋「新圖像中的6島」是什麼意思,你想要在圖像處理技術方面應用什麼邏輯。 –

回答

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)_這不起作用,因爲顏色可能會有所不同,如操作中所述。要麼需要一個帶有epsilon的色彩距離函數,要麼可能是一個簡單的截斷:將每個通道向右移動1-4個像素並比較截斷的顏色。 – TaW