2015-05-20 61 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