如何在鼠标位置(RFC)获取Panel像素的颜色

时间:2014-03-18 23:25:45

标签: c# colors panel rfc getpixel

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

1 个答案:

答案 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解决方案可以使用。