2009-04-15 21 views
25

X、Yでピクセルの色をC#で取得するにはどうすればよいですか?X、Yでピクセルの色をC#で取得するにはどうすればよいですか?

結果として、結果を必要なカラーフォーマットに変換できます。このためのAPI呼び出しがあると確信しています。

"モニタ上の任意のX、Yについて、そのピクセルの色を取得したいです。"

+0

は、画面上またはあなたのアプリでウィンドウでこのどこかですか? – ChrisF

+0

一般的なディスプレイです。私は特定のインスタンスについては気にしません。 – MichaelICE

+0

モニター上の任意のX、Yについて、そのピクセルの色を取得したいとします。 – MichaelICE

答えて

36

ここ画面からピクセルの色を取得するには、Pinvoke.netからのコードです:脇P /呼び出し溶液から

using System; 
    using System.Drawing; 
    using System.Runtime.InteropServices; 

    sealed class Win32 
    { 
     [DllImport("user32.dll")] 
     static extern IntPtr GetDC(IntPtr hwnd); 

     [DllImport("user32.dll")] 
     static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc); 

     [DllImport("gdi32.dll")] 
     static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos); 

     static public System.Drawing.Color GetPixelColor(int x, int y) 
     { 
     IntPtr hdc = GetDC(IntPtr.Zero); 
     uint pixel = GetPixel(hdc, x, y); 
     ReleaseDC(IntPtr.Zero, hdc); 
     Color color = Color.FromArgb((int)(pixel & 0x000000FF), 
        (int)(pixel & 0x0000FF00) >> 8, 
        (int)(pixel & 0x00FF0000) >> 16); 
     return color; 
     } 
    } 
+0

'GetPixelColor'メソッドで何をしたのか説明してください。 (主にビット単位の部分)ありがとう! –

+1

ピクセル= 32ビットint GetPixelは32ビットのint型の値 をビット単位で取得し、32ビットの値を8ビットの値に分解するので、Color.FromArgb関数を使用して32ビットの値を3→8ビットに変換できます色。彼は必要ではない値を&0x0000FF00(唯一のsencondバイト)に変換するためにマスクを使用しています。0:255 –

10

画像にはBitmap.GetPixelがあります...あなたが何をしているのですか?そうでない場合、どのx、yの値を意味するのでしょうか?コントロールで?あなたはは、画像のために意味ですか、そしてあなたが多くのピクセルのを取得したい、とあなたが危険なコードで働いて気にしない場合は、Bitmap.LockBitsはへの呼び出しの多くよりもはるかに高速になることを

注意GetPixel

+0

私は現在のディスプレイから、特定のファイルではなく、ペイントボックスのインスタンスからそれが必要です。 – MichaelICE

+0

その場合はCLaRGeのソリューションをお勧めします。 –

2

、あなたがに、画面から画像データを取得するためにGraphics.CopyFromScreenを使用することができますグラフィックスオブジェクト。ただし、移植性について心配していない場合は、P/Invokeソリューションをお勧めします。 WPFのRefについては

1

:(PointToScreenの使用)

System.Windows.Point position = Mouse.GetPosition(lightningChartUltimate1); 

    if (lightningChartUltimate1.ViewXY.IsMouseOverGraphArea((int)position.X, (int)position.Y)) 
    { 
     System.Windows.Point positionScreen = lightningChartUltimate1.PointToScreen(position); 
     Color color = WindowHelper.GetPixelColor((int)positionScreen.X, (int)positionScreen.Y); 
     Debug.Print(color.ToString()); 


     ... 

     ... 


public class WindowHelper 
{ 
    // ****************************************************************** 
    [DllImport("user32.dll")] 
    static extern IntPtr GetDC(IntPtr hwnd); 

    [DllImport("user32.dll")] 
    static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc); 

    [DllImport("gdi32.dll")] 
    static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos); 

    static public System.Windows.Media.Color GetPixelColor(int x, int y) 
    { 
     IntPtr hdc = GetDC(IntPtr.Zero); 
     uint pixel = GetPixel(hdc, x, y); 
     ReleaseDC(IntPtr.Zero, hdc); 
     Color color = Color.FromRgb(
      (byte)(pixel & 0x000000FF), 
      (byte)((pixel & 0x0000FF00) >> 8), 
      (byte)((pixel & 0x00FF0000) >> 16)); 
     return color; 
    } 
+0

追加情報:必要な 'System.Windows.Media.Color'名前空間を使うためにPresentationCore.dllを参照に追加します。 –

関連する問題