Nasıl yapılır: Doğrusal Gradyan Oluşturma

GDI+ yatay, dikey ve çapraz doğrusal gradyanlar sağlar. Varsayılan olarak, doğrusal gradyandaki renk aynı şekilde değişir. Ancak, doğrusal gradyanı özelleştirerek rengin tekdüzen olmayan bir şekilde değişmesini sağlayabilirsiniz.

Dekont

Bu makaledeki örnekler, denetimin Paint olay işleyicisinden çağrılan yöntemlerdir.

Aşağıdaki örnek bir çizgi, üç nokta ve dikdörtgeni yatay doğrusal gradyan fırçasıyla doldurur.

Oluşturucu LinearGradientBrush dört bağımsız değişken alır: iki nokta ve iki renk. İlk nokta (0, 10) ilk renkle (kırmızı) ve ikinci nokta (200, 10) ikinci renkle (mavi) ilişkilendirilir. Beklediğiniz gibi, (0, 10) ile (200, 10) arasında çizilen çizgi kırmızıdan maviye kademeli olarak değişir.

Puanlardaki 10'lar (0, 10) ve (200, 10) önemli değildir. Önemli olan, iki noktanın aynı ikinci koordinata sahip olmasıdır; bunları bağlayan çizgi yataydır. Üç nokta ve dikdörtgen de yatay koordinat 0'dan 200'e doğru ilerlerken kırmızıdan maviye kademeli olarak değişir.

Aşağıdaki çizimde çizgi, üç nokta ve dikdörtgen gösterilmektedir. Yatay koordinat 200'e yükseldikçe renk gradyanlarının yinelendiğini unutmayın.

A line, an ellipse, and a rectangle filled with a color gradient.

Yatay doğrusal gradyanları kullanmak için

  • Sırasıyla opak kırmızı ve opak maviyi üçüncü ve dördüncü bağımsız değişken olarak geçirin.

    public void UseHorizontalLinearGradients(PaintEventArgs e)
    {
        LinearGradientBrush linGrBrush = new LinearGradientBrush(
           new Point(0, 10),
           new Point(200, 10),
           Color.FromArgb(255, 255, 0, 0),   // Opaque red
           Color.FromArgb(255, 0, 0, 255));  // Opaque blue
    
        Pen pen = new Pen(linGrBrush);
    
        e.Graphics.DrawLine(pen, 0, 10, 200, 10);
        e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100);
        e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30);
    }
    
    Dim linGrBrush As New LinearGradientBrush( _
       New Point(0, 10), _
       New Point(200, 10), _
       Color.FromArgb(255, 255, 0, 0), _
       Color.FromArgb(255, 0, 0, 255))
    Dim pen As New Pen(linGrBrush)
    
    e.Graphics.DrawLine(pen, 0, 10, 200, 10)
    e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100)
    e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30)
    
    

Yukarıdaki örnekte, 0 yatay koordinatından 200 yatay koordinata doğru ilerlediğinizde renk bileşenleri doğrusal olarak değişir. Örneğin, ilk koordinatı 0 ile 200 arasında olan bir nokta, 0 ile 255 arasında bir mavi bileşene sahip olur.

GDI+, bir rengin gradyanın bir kenarından diğerine değişme şeklini ayarlamanıza olanak tanır. Aşağıdaki tabloya göre siyahtan kırmızıya değişen bir gradyan fırçası oluşturmak istediğinizi varsayalım.

Yatay koordinat RGB bileşenleri
0 (0, 0, 0)
40 (128, 0, 0)
200 (255, 0, 0)

Yatay koordinat 0 ile 200 arasındaki yolun yalnızca yüzde 20'si olduğunda kırmızı bileşenin yarı yoğunlukta olduğunu unutmayın.

Aşağıdaki örnek, özelliğini üç göreli yoğunlukla üç göreli konumla ilişkilendirecek şekilde ayarlar LinearGradientBrush.Blend . Yukarıdaki tabloda olduğu gibi, göreli 0,5 yoğunluğu 0,2 göreli konumuyla ilişkilendirilir. Kod, üç nokta ve dikdörtgeni gradyan fırçayla doldurur.

Aşağıdaki çizimde elde edilen üç nokta ve dikdörtgen gösterilmektedir.

An ellipse and a rectangle filled with a horizontal color gradient.

Doğrusal gradyanları özelleştirmek için

  • Sırasıyla üçüncü ve dördüncü bağımsız değişken olarak opak siyah ve opak kırmızıyı geçirin.

    public void CustomizeLinearGradients(PaintEventArgs e)
    {
        LinearGradientBrush linGrBrush = new LinearGradientBrush(
           new Point(0, 10),
           new Point(200, 10),
           Color.FromArgb(255, 0, 0, 0),     // Opaque black
           Color.FromArgb(255, 255, 0, 0));  // Opaque red
    
        float[] relativeIntensities = { 0.0f, 0.5f, 1.0f };
        float[] relativePositions = { 0.0f, 0.2f, 1.0f };
    
        //Create a Blend object and assign it to linGrBrush.
        Blend blend = new Blend();
        blend.Factors = relativeIntensities;
        blend.Positions = relativePositions;
        linGrBrush.Blend = blend;
    
        e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100);
        e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30);
    }
    
    Dim linGrBrush As New LinearGradientBrush( _
       New Point(0, 10), _
       New Point(200, 10), _
       Color.FromArgb(255, 0, 0, 0), _
       Color.FromArgb(255, 255, 0, 0))
    
    Dim relativeIntensities As Single() = {0.0F, 0.5F, 1.0F}
    Dim relativePositions As Single() = {0.0F, 0.2F, 1.0F}
    
    'Create a Blend object and assign it to linGrBrush.
    Dim blend As New Blend()
    blend.Factors = relativeIntensities
    blend.Positions = relativePositions
    linGrBrush.Blend = blend
    
    e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100)
    e.Graphics.FillRectangle(linGrBrush, 0, 155, 500, 30)
    
    

Önceki örneklerde yer alan gradyanlar yataydı; diğer bir ifadeyle, herhangi bir yatay çizgi boyunca ilerlerken renk kademeli olarak değişir. Dikey gradyanları ve çapraz gradyanları da tanımlayabilirsiniz.

Aşağıdaki örnek noktaları (0, 0) ve (200, 100) bir LinearGradientBrush oluşturucuya geçirir. Mavi renk (0, 0) ile ilişkilendirilir ve yeşil renk (200, 100) ile ilişkilendirilir. Çizgi (kalem genişliği 10) ve üç nokta doğrusal gradyan fırça ile doldurulur.

Aşağıdaki çizimde çizgi ve üç nokta gösterilmektedir. Üç noktadaki rengin, (0, 0) ve (200, 100) geçen çizgiye paralel herhangi bir çizgi boyunca ilerledikçe kademeli olarak değiştiğine dikkat edin.

A line and an ellipse filled with a diagonal color gradient.

Çapraz doğrusal gradyanlar oluşturmak için

  • Sırasıyla opak mavi ve opak yeşili üçüncü ve dördüncü bağımsız değişken olarak geçirin.

    public void CreateDiagonalLinearGradients(PaintEventArgs e)
    {
        LinearGradientBrush linGrBrush = new LinearGradientBrush(
           new Point(0, 0),
           new Point(200, 100),
           Color.FromArgb(255, 0, 0, 255),   // opaque blue
           Color.FromArgb(255, 0, 255, 0));  // opaque green
    
        Pen pen = new Pen(linGrBrush, 10);
    
        e.Graphics.DrawLine(pen, 0, 0, 600, 300);
        e.Graphics.FillEllipse(linGrBrush, 10, 100, 200, 100);
    }
    
    Dim linGrBrush As New LinearGradientBrush( _
       New Point(0, 0), _
       New Point(200, 100), _
       Color.FromArgb(255, 0, 0, 255), _
       Color.FromArgb(255, 0, 255, 0))
    ' opaque blue
    ' opaque green
    Dim pen As New Pen(linGrBrush, 10)
    
    e.Graphics.DrawLine(pen, 0, 0, 600, 300)
    e.Graphics.FillEllipse(linGrBrush, 10, 100, 200, 100)
    
    

Ayrıca bkz.