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

时间:2014-07-14 02:19:09

标签: c# xna

我想制作一个可以检测所选像素的颜色的系统。

    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
    }

但我不知道应该如何选择某个像素

1 个答案:

答案 0 :(得分:1)

这可能对您有所帮助

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()
   }
}

来源:How to read the Color of a Screen Pixel