【发布时间】:2014-08-13 02:53:54
【问题描述】:
我确实有一种工作方法,但是它相当耗费资源,我正在寻找一种更好的方法。在对类似问题here 的回复中建议运行以下代码。
但是运行上述代码会产生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;
【问题讨论】:
-
你为什么使用
Format16bppArgb1555?哪一行抛出异常? -
我试过有无,我只有它,因为我只需要 8 位颜色精度。我将更新帖子,说明哪一行引发了异常。
-
screenPixel是类成员还是局部变量?在链接的解决方案中,它是一个被重用的类成员(并希望在表单的 Dispose 方法中处理掉)。 -
顺便说一句:
using已经调用了Dispose,你为什么要显式调用它。尝试删除它们.... -
只需在 .NET 中查找 EyeDropper 示例并根据您的需要进行更改:bobpowell.net/eyedropper.aspx