如何使用c#获得X,Y处像素的颜色?

如何使用c#获得X,Y处像素的颜色?,c#,api,C#,Api,如何使用c#获得X,Y处像素的颜色 至于结果,我可以将结果转换为颜色格式I 需要。我确信这是一个API调用 对于显示器上任何给定的X,Y,我想得到它的颜色 像素。有一个图像。。。这就是你想要的吗?如果不是,你能说出你指的是哪个x,y值吗?在控件上 请注意,如果您确实是指图像,并且希望获得大量像素,并且不介意使用不安全的代码,那么从屏幕获取像素颜色的速度将比大量调用GetPixel要快得多 除了p/Invoke解决方案之外,还可以使用Graphics.CopyFromScreen将图像数据从屏幕获

如何使用c#获得X,Y处像素的颜色

至于结果,我可以将结果转换为颜色格式I 需要。我确信这是一个API调用


对于显示器上任何给定的X,Y,我想得到它的颜色 像素。

有一个图像。。。这就是你想要的吗?如果不是,你能说出你指的是哪个x,y值吗?在控件上


请注意,如果您确实是指图像,并且希望获得大量像素,并且不介意使用不安全的代码,那么从屏幕获取像素颜色的速度将比大量调用
GetPixel
要快得多


除了p/Invoke解决方案之外,还可以使用Graphics.CopyFromScreen将图像数据从屏幕获取到图形对象中。但是,如果您不担心可移植性,我建议您使用P/Invoke解决方案。

对于WPF中的ref:(使用PointToScreen)


如果有人对此有问题,并且没有一个解决方案是有效的,就像我和你在WPF时一样,下面是我如何让我的解决方案工作的:-)


这是在屏幕上还是在应用程序的窗口中?只是一般显示。我不关心任何特定的实例。对于显示器上任何给定的X,Y,我想获得该像素的颜色。我需要从当前显示中获得它,而不是特定的文件或油漆盒的实例。在这种情况下,我将推荐CLaRGe的解决方案。你能解释一下为什么你在
GetPixelColor
方法中这样做吗?(大部分是按位部分)谢谢!Pixel=32位int Getpixel使用按位方式获取32位int值他将32位值分解为8位值,因此他可以使用函数Color.FromArgb将32位值转换为3->8位颜色。他正在使用掩码将不需要的值转换为&0x0000FF00(仅第二个字节),然后将值旋转成0:255的比例。其他信息:对于使用
System.Windows.Media.Color
命名空间,您需要将PresentationCore.dll添加到引用中。
  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;
      }
   }
    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;
    }
        [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);
        }