我爱 SO。在10个问题中的8个问题中,它产生了一个简单且立即可用的答案。或者至少解释为什么我的问题有些不对。
所以我觉得很奇怪,因为这个简单而无法找到我喜欢的答案,而且我有一个相当普遍的问题。
在搜索高低之后,我将以下解决方案拼凑在一起。它工作正常,但我想知道:
它有缺陷吗? (例如:我需要处理吗?)
是否有更好的解决方案,可能会减少复制次数?
我希望看到一个使用CopyFromScreen的灵魂,它可能只使用1x1的位图大小,但需要一个图形..所以我们将不胜感激。
或直接访问控件像素的人。
注1:我想从面板中抓取颜色!不是从图片框而不是从屏幕.. 注2:对于我的项目速度并不重要,因为我想创建一个吸管工具。但也欢迎快速的方式;谁知道我接下来会去哪里..
我的解决方案:
public Color getColor(Control ctl, Point location)
{
Bitmap bmp = new Bitmap(ctl.Width, ctl.Height);
ctl.DrawToBitmap(bmp, new Rectangle(0, 0, ctl.Width, ctl.Height));
Color col = bmp.GetPixel(location.X, location.Y);
bmp.Dispose();
return col;
}
我在colorsPanel_MouseClick事件中使用它:
myPen = new Pen(getColor(colorsPanel, e.Location), myStrokeWidth);
答案 0 :(得分:0)
我想出了一个使用CopyFromScreen的版本:
public Color getScrColor(Control ctl, Point location)
{
Bitmap bmp = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(bmp);
Point screenP = ctl.PointToScreen(location);
g.CopyFromScreen(screenP.X, screenP.Y, 0, 0, new Size(1, 1));
Color col = bmp.GetPixel(0, 0);
bmp.Dispose();
return col;
}
它的工作正常,但似乎比使用DrawToBitmap的那个慢很多(比10倍)。我怀疑PointToScreen是原因和测试版本,每次移动图形而不创建它同样慢。
所以我猜CopyFromScreen调用速度要慢得多,因此像素数并不重要。好吧,在合理的范围内,可能。我的调色板控制大约是60x400像素。
因此暂时我猜原始的GetColor解决方案可以使用。