2009-04-15 11 views
25

Come posso ottenere il colore di un pixel su X, Y usando C#?Come posso ottenere il colore di un pixel su X, Y usando C#?

Per quanto riguarda il risultato, posso convertire i risultati nel formato colore di cui ho bisogno. Sono sicuro che ci sia una chiamata API per questo.

"Per ogni dato X, Y sul monitor, voglio ottenere il colore di quel pixel."

+0

È questo un punto qualsiasi dello schermo o in una finestra nella tua app? – ChrisF

+0

Solo il display generale. Non mi interessa alcun caso particolare. – MichaelICE

+0

Per ogni dato X, Y sul monitor, voglio ottenere il colore di quel pixel. – MichaelICE

risposta

36

per ottenere un colore di pixel dal schermo ecco codice Pinvoke.net:

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

Puoi spiegare perché hai fatto quello che hai fatto con il metodo 'GetPixelColor'? (principalmente le parti bit a bit) Grazie! –

+1

Pixel = 32 bit int Getpixel ottiene un valore int con 32 bit utilizzando bit a bit decompone quei valori a 32 bit in valori a 8 bit, quindi può utilizzare la funzione Color.FromArgb per convertire il valore a 32 bit in un 3 -> 8 bit colori. Usa le maschere per convertire i valori che non ha bisogno con & 0x0000FF00 (solo un byte sencond) e quindi ruota i valori per essere in scala 0: 255 –

10

C'è Bitmap.GetPixel per un'immagine ... è questo quello che cerchi? In caso contrario, potresti dire quale valore x, y intendi? Su un controllo?

Si noti che se si fa significa per un'immagine e si desidera ottenere un sacco di pixel, e non vi occupate di lavorare con il codice non sicuro, quindi Bitmap.LockBits sarà molto più veloce di un sacco di chiamate a GetPixel.

+0

Ne ho bisogno dal display corrente, non da un file particolare o dall'istanza di una scatola di colori. – MichaelICE

+0

In tal caso, consiglierei la soluzione di CLaRGe. –

2

A parte la soluzione di P/Invoke, è possibile utilizzare Graphics.CopyFromScreen per ottenere i dati di immagine dallo schermo in un Oggetto grafico Se non sei preoccupato per la portabilità, tuttavia, ti consiglierei la soluzione P/Invoke.

1

Per ref in WPF: (utilizzo di 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

Informazioni aggiuntive: per usare lo spazio dei nomi 'System.Windows.Media.Color' di cui hai bisogno aggiungere PresentationCore.dll ai riferimenti. –

Problemi correlati