web-dev-qa-db-fra.com

Comment obtenir la couleur d'un pixel en X, Y en utilisant c #?

Comment obtenir la couleur d'un pixel en X, Y en utilisant c #?

En ce qui concerne le résultat, je peux convertir les résultats au format de couleur dont j'ai besoin. Je suis sûr qu'il y a un appel API pour cela.

Pour tout X, Y donné sur le moniteur, je veux obtenir la couleur de ce pixel.

25
MichaelICE

Pour obtenir une couleur de pixel à partir de Screen voici le code à partir de 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;
      }
   }
37
CLaRGe

Il y a Bitmap.GetPixel pour une image ... est-ce ce que vous cherchez? Si non, pourriez-vous dire quelle valeur x, y vous voulez dire? Sur un contrôle?

Notez que si do signifie pour une image et que vous voulez obtenir lots de pixels et que le fait de travailler avec du code non sécurisé ne vous dérange pas, alors Bitmap.LockBits sera beaucoup plus rapidement que beaucoup d'appels à GetPixel.

10
Jon Skeet

Outre la solution P/Invoke, vous pouvez utiliser Graphics.CopyFromScreen pour importer les données d'image de l'écran dans un objet Graphics. Cependant, si vous n'êtes pas inquiet à propos de la portabilité, je recommanderais la solution P/Invoke.

2
Simon Broadhead

Pour référence dans WPF: (utilisation de 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;
    }
1
Eric Ouellet

si quelqu'un a des problèmes avec cela et qu'aucune des solutions ne fonctionne, comme ce fut le cas pour moi, et que vous êtes dans WPF, voici comment j'ai fait fonctionner les miennes :-).

        [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);

        public static void getColor()
        {
            IntPtr hdc = GetDC(IntPtr.Zero);
            uint pixel = GetPixel(hdc, Cursor.Position.X, Cursor.Position.Y);
            ReleaseDC(IntPtr.Zero, hdc);
            System.Drawing.Color color = System.Drawing.Color.FromArgb((int)pixel);
            Console.WriteLine("Color is {0}", color);
        }
0
Cully Lineberger