2015-05-20 60 views
5

我正在处理项目,我必须使用C#做一种颜色选择器。用三种颜色的渐变填充面板

所以我决定在Win Forms App中这将是一个具有此背景的面板。

背景应该有三种颜色的RGB梯度:红色(0 - 255),蓝色(0 - 255),绿色= 0

gu0oJ.png

但我不能找到任何信息我应该用这个。

我试着写一些代码,这是我所做的。

{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 



    private void Form1_Load(object sender, EventArgs e) 
    { 
     panel1.Paint += new PaintEventHandler(panel1_Paint); 
     panel1.Refresh(); 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     Point startPoint = new Point(0, 0); 
     Point endPoint = new Point(150, 150); 

     LinearGradientBrush lgb = 
      new LinearGradientBrush(startPoint, endPoint,  Color.FromArgb(255, 255, 0, 0), Color.FromArgb(255, 255, 255, 0)); 
     Graphics g = e.Graphics; 
     g.FillRectangle(lgb, 0, 0, 150, 150); 
     // g.DrawLine(new Pen(Color.Yellow, 1.5f), startPoint, endPoint); 
    } 
} 

}

现在我有面板,该梯度

ORnzf.png

我应该用什么在第一张图片以获得梯度?

第二个问题:点击此背景后,我应该怎么做才能获得像素颜色?

+0

而且,这种联系可能有助于回答大家的一些问题:https://msdn.microsoft.com/en-us/magazine/cc164113.aspx –

+0

见我的答案更新..! – TaW

回答

10

下面是在Paint事件中使用的多色LinearGradientBrush一个例子:

LinearGradientBrush linearGradientBrush = 
    new LinearGradientBrush(panel4.ClientRectangle, Color.Red, Color.Yellow, 45); 

ColorBlend cblend = new ColorBlend(3); 
cblend.Colors = new Color[3] { Color.Red, Color.Yellow, Color.Green }; 
cblend.Positions = new float[3] { 0f, 0.5f, 1f }; 

linearGradientBrush.InterpolationColors = cblend; 

e.Graphics.FillRectangle(linearGradientBrush, panel4.ClientRectangle); 

enter image description here

可以自由变化的颜色的数目,角度或止动点的传播。只要确保你总是有相同数量的颜色和结束点,让他们在0和结束从1开始

构造函数中的颜色被忽略了,顺便说一句..

为了得到一个点击的颜色你可以编写代码MouseClick

Color clickedColor = Color.Empty; 

private void panel4_MouseClick(object sender, MouseEventArgs e) 
{ 
    using (Bitmap bmp = new Bitmap(panel4.ClientSize.Width, panel4.ClientSize.Height)) 
    { 
     panel4.DrawToBitmap(bmp,panel4.ClientRectangle); 
     clickedColor = bmp.GetPixel(e.X, e.Y); 
    } 
} 

如果你想赶上多少点击它可以更好地保持Bitmap一类级别的变量,而不是重新创建它所有的时间..设置它作为小组的BackgroundImage,如卡拉的回答假设也可能是一个不错的选择..

这应该回答标题中的问题。但是,您的第一张图片不会显示三种颜色的渐变。它显示了四种颜色的2D渐变。对于这种更昂贵的着色方法,您应该将颜色置于Bitmap并将其设置为PanelBackgroundImage ..

更新下面是一段代码,创建了一个2D梯度:

Bitmap Gradient2D(Rectangle r, Color c1, Color c2, Color c3, Color c4) 
{ 
    Bitmap bmp = new Bitmap(r.Width, r.Height); 

    float delta12R = 1f * (c2.R - c1.R)/r.Height; 
    float delta12G = 1f * (c2.G - c1.G)/r.Height; 
    float delta12B = 1f * (c2.B - c1.B)/r.Height; 
    float delta34R = 1f * (c4.R - c3.R)/r.Height; 
    float delta34G = 1f * (c4.G - c3.G)/r.Height; 
    float delta34B = 1f * (c4.B - c3.B)/r.Height; 
    using (Graphics G = Graphics.FromImage(bmp)) 
    for (int y = 0; y < r.Height; y++) 
    { 
     Color c12 = Color.FromArgb(255, c1.R + (int)(y * delta12R), 
       c1.G + (int)(y * delta12G), c1.B + (int)(y * delta12B)); 
     Color c34 = Color.FromArgb(255, c3.R + (int)(y * delta34R), 
       c3.G + (int)(y * delta34G), c3.B + (int)(y * delta34B)); 
     using (LinearGradientBrush lgBrush = new LinearGradientBrush(
       new Rectangle(0,y,r.Width,1), c12, c34, 0f)) 
     { G.FillRectangle(lgBrush, 0, y, r.Width, 1); } 
    } 
    return bmp; 
} 

这里是你如何使用它:

public Form1() 
    { 
     InitializeComponent(); 
     panel4.BackgroundImage = Gradient2D(panel4.ClientRectangle, 
       Color.Black, Color.FromArgb(255, 0, 255, 0), Color.Red, Color.Yellow); 
    } 

它使用简单LinearGradientBrushes不需要额外的颜色列表吧向下翻过Panel的高度。

请注意,Color.Green是一个相当黑暗的色调,所以我用FromRgb为更亮的绿色。如果您的Panel大于256像素,则可以通过填充较大的条纹来进行优化; IFS它是垂直的,你可能要改变回路中去X代替Ÿ过..

下面是结果:

enter image description here

点击式接你现在只需读出彩从BackgroundImage

private void panel4_MouseClick(object sender, MouseEventArgs e) 
{ 
    clickedColor = ((Bitmap)panel4.BackgroundImage).GetPixel(e.X, e.Y); 
} 
+0

非常感谢,man! – Buga1234

2

从鼠标点击事件参数E,你可以用点击的确切坐标明白了吧:

Point clickPoint = e.GetPosition(backgroundControlWithImg); 

然后在该位置上使用类似获得图像的颜色:

System.Drawing.Image image = backgroundControl.BackgroundImage; 
Bitmap _bitmap = new Bitmap(image); 
Color _color = bitmap.GetPixel(Point.x, Point.y); 

就是这样的。你用什么颜色选择器,WPF或?

+0

谢谢fot答案,点击我了解它的工作原理。主要问题是使用渐变来执行此面板。你有这方面的解决方案吗?我使用Windows窗体不是WPF,但是我可以尝试在WPF中执行,如果有一些解决方案 – Buga1234