有没有一种方法可以捕获屏幕像素的颜色而无需截取C#?

时间:2020-06-29 00:55:28

标签: c# winforms

我正在制作一个程序,该程序检测屏幕的某个扇区以执行所需的操作,并且通过截屏逐像素查看屏幕快照来找到要分析的扇区,并将其与所需的更改进行比较但我有一个问题,我使用计时器每秒钟每20次拍摄一次屏幕快照,负责拍摄该屏幕快照的句子以我完全不理解的异常结束,它有时可以正常工作,直到出现异常“ ArgumentsException”出现,并显示消息“参数无效”,因此我不知道可能会发生什么,我应该发送正确的参数,甚至将句子设置为空,以为有什么遗漏但没有,同样的事情还在继续,我不明白为什么。

现在,我不知道是否还有其他方法可以直接检测并且不进行屏幕截图,而无需捕获屏幕快照,因为我发现从句子中捕获图像的句子存在问题。屏幕。

我用来截图的代码是:

screenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppRgb);
g = Graphics.FromImage(screenCapture);
g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, screenCapture.Size, CopyPixelOperation.SourceCopy);

有时候问题出在位图上,有时是图形出同样的问题,所以您可以根据我的需要推荐我吗?

1 个答案:

答案 0 :(得分:1)

无需截屏,您可以使用Win32 API GetPixel:https://www.pinvoke.net/default.aspx/gdi32/getpixel.html

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

或者认为Blit比屏幕截图便宜,C# - Faster Alternatives to SetPixel and GetPixel for Bitmaps for Windows Forms App