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.
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;
}
}
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
.
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.
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;
}
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);
}