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