在屏幕上获得点颜色的有效方法
本文关键字:颜色 有效 方法 屏幕 | 更新日期: 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。在我看来,这样更安全,麻烦更少。