在屏幕上获得点颜色的有效方法

本文关键字:颜色 有效 方法 屏幕 | 更新日期: 2023-09-27 18:17:53

我确实有一个工作方法,但它是相当资源密集,我正在寻找一个更好的方法。对于类似问题的回答,建议运行下面的代码。

然而,运行上述代码产生System.OutOfMemoryException

发生异常@ using (Graphics gdest = Graphics.FromImage(screenPixel)) {

当前代码:

Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format16bppArgb1555);
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, x, y, (int)CopyPixelOperation.SourceCopy);
        gdest.ReleaseHdc();
        gsrc.ReleaseHdc();
        }
   }
    return screenPixel.GetPixel(0, 0);
编辑:

好的,所以我已经修复了问题,我上面有以下代码。然而,现在我只得到黑色(0,0,0)的颜色返回。

this.screenPixel = new Bitmap(1, 1, PixelFormat.Format16bppRgb555);
using (Graphics gdest = Graphics.FromImage(this.screenPixel)) {
    using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero)) {
        IntPtr hSrcDC = gsrc.GetHdc();
        IntPtr hDC = gdest.GetHdc();
        int retval = BitBlt(hDC, 0, 0, width, height, hSrcDC, x, y, (int)CopyPixelOperation.SourceCopy);
        gdest.ReleaseHdc();
        gsrc.ReleaseHdc();
        }
}
Color result = screenPixel.GetPixel(0, 0);
Console.WriteLine(result.R + " " + result.G + " " + result.B);
GC.SuppressFinalize(this.screenPixel);
this.screenPixel.Dispose();
return result;

在屏幕上获得点颜色的有效方法

这里似乎行得通:

using System.Runtime.InteropServices;
//... 

[DllImport("gdi32.dll")]
public static extern int BitBlt(IntPtr hObject, int nXDest, int nYDest, 
   int nWidth, int nHeight, IntPtr hObjSource, int nXSrc, int nYSrc, int  dwRop);
//..
    Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppRgb);
    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, x, y,
                                    (int) CopyPixelOperation.SourceCopy);
            gdest.ReleaseHdc();
            gsrc.ReleaseHdc();
        }
    }
    Color c =  screenPixel.GetPixel(0, 0);
    return c;

注释1:

  • 我已经更改了像素格式以匹配我的屏幕。
  • 我修改了BitBlt声明

注2:

根据这篇文章,你也可以使用图形。直接CopyFromScreen,因为它无论如何都会使用BitBlt。在我看来,这样更安全,麻烦更少。