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 in new image」の意味を説明し、画像処理技術の観点から適用したい論理は何ですか? –

答えて

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に記載されているように色が少し変わる可能性があるため動作しません。色の距離関数をイプシロンで行うか、単純な切り捨ても必要です。各チャネルを右に1〜4ピクセルシフトし、切り捨てられた色を比較します。 – TaW

関連する問題