2014-03-18 18 views
0

I SO。在10个问题中的8个中,它产生了一个直接且可立即使用的答案。或者至少解释了为什么我的问题有些不对。如何获取鼠标位置的面板像素的颜色(RFC)

所以我发现很奇怪,我无法找到我喜欢这个简单的答案,而且我已经假设了一个相当常见的问题。

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

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

  • 有没有更好的解决方案,可能会减少复制进行?

我想看到CopyFromScreen,它可能只使用一个1x1的位图大小soultion,但需要一个图形。所以替代解决方案将不胜感激。

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

注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

我想出了一个版本,它使用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; 
} 

它也能很好地工作,但似乎慢得多(10倍) e使用DrawToBitmap。我怀疑PointToScreen是否是原因,并且每次交付图形而不创建它的测试版本也同样缓慢。

所以我猜CopyFromScreen的调用速度太慢了,像素的数量并不重要。那么,在合理的范围内,可能。我的调色板控件约为60x400像素。

因此,暂时我猜原来的GetColor解决方案可以使用。