-1

I want to make a system that can detect the color of a certain pixel that is selected.

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

Now I want to do something like this

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

But I don't know how I should do the part where it picks a certain pixel

jonathanh8686
  • 78
  • 1
  • 6

1 Answers1

1

This may help you

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

EDIT:

Given the above GetColorAt function you can poll a certain pixel on the screen in a safe, performance friendly way like this:

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

Source : How to read the Color of a Screen Pixel

Community
  • 1
  • 1
Mena Tallet
  • 28
  • 1
  • 4