1

喜欢这样。在 10 个问题中的 8 个问题中,它会产生一个直接且立即可用的答案。或者至少解释了为什么我的问题在某种程度上是错误的。

所以我觉得很奇怪,对于这个简单而且我认为是相当普遍的问题,我找不到我喜欢的答案。

在搜索高低后,我将以下解决方案拼凑在一起。它工作正常,但我想知道:

  • 它有缺陷吗?(例如:我需要处置吗?)

  • 有没有更好的解决方案,也许复制更少?

我想看到一个带有 CopyFromScreen 的灵魂,它可能只使用 1x1 位图大小,但需要一个 Graphics .. 所以另一种解决方案将不胜感激。

或者直接访问控件像素的一种。

注意 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);
4

1 回答 1

1

我想出了一个使用 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 解决方案可以使用。

于 2014-03-19T09:53:17.563 回答