我如何检测某个像素的颜色

本文关键字:像素 颜色 检测 何检测 | 更新日期: 2023-09-27 18:12:57

我想做一个系统,可以检测选定的某个像素的颜色。

    Color[] pixelData;
    pixelData= new Color[graphics.GraphicsDevice.Viewport.Width * (graphics.GraphicsDevice.Viewport.Height)];
    Terrain.GetData(pixelData);

现在我想这样做

    if(pixelData[graphics.GraphicsDevice.Viewport.Width * playervec.Y + playervec.X].R == 255)
    {
       rest of the code
    }

但是我不知道该怎么做它会选择某个像素

我如何检测某个像素的颜色

这可能对你有帮助

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;
namespace FormTest
{
  public partial class Form1 : Form
   {
    [DllImport("user32.dll")]
    static extern bool GetCursorPos(ref Point lpPoint);
    [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
    public static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
    public Form1()
    {
        InitializeComponent();
    }
    private void MouseMoveTimer_Tick(object sender, EventArgs e)
    {
        Point cursor = new Point();
        GetCursorPos(ref cursor);
        var c = GetColorAt(cursor);
        this.BackColor = c;
        if (c.R == c.G && c.G < 64 && c.B > 128)
        {
            MessageBox.Show("Blue");
        }
    }
    Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
    public Color GetColorAt(Point location)
    {
        using (Graphics gdest = Graphics.FromImage(screenPixel))
        {
            using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero))
            {
                IntPtr hSrcDC = gsrc.GetHdc();
                IntPtr hDC = gdest.GetHdc();
                int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, location.X, location.Y, (int)CopyPixelOperation.SourceCopy);
                gdest.ReleaseHdc();
                gsrc.ReleaseHdc();
            }
        }
        return screenPixel.GetPixel(0, 0);
    }
  }
}
编辑:

给定上述GetColorAt函数,您可以以安全,性能友好的方式轮询屏幕上的特定像素,如下所示:

 private void PollPixel(Point location, Color color)
{
  while(true)
 {
    var c = GetColorAt(location);
    if (c.R == color.R && c.G == color.G && c.B == color.B)
    {
        DoAction();
        return;
    }
    // By calling Thread.Sleep() without a parameter, we are signaling to the
    // operating system that we only want to sleep long enough for other
    // applications.  As soon as the other apps yield their CPU time, we will
    // regain control.
    Thread.Sleep()
   }
}

来源:如何读取屏幕像素的颜色