如何:创建线性渐变

GDI+ 提供水平、垂直和对角线方向线性渐变。 在默认情况下,线性渐变中的颜色均匀地变化。 当然,也可自定义线性渐变,使颜色非均匀变化。

下面的示例使用水平线性渐变画笔填充线条、椭圆和矩形。

LinearGradientBrush 构造函数接收四个参数:两个点和两种颜色。 第一个点 (0, 10) 与第一种颜色(红色)相关联,第二个点 (200, 10) 与第二种颜色(蓝色)相关联。 正如您所期望的那样,从 (0, 10) 绘制到 (200, 10) 的线条的颜色从红色逐渐变成蓝色。

点 (50, 10) 和点 (200, 10) 中的 10 无关紧要。 重要的是这两个点的第二个坐标相同——它们之间的连线是水平的。 当水平坐标从 0 移到 200 时,椭圆和矩形也逐渐从红色变成蓝色。

下面的插图显示线条、椭圆和矩形。 请注意,当水平坐标增加到 200 以上时,颜色渐变重复其自身。

线性渐变

使用水平线性渐变

  • 将不透明红和不透明蓝分别作为第三和第四个参数传递。

            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)
    
    
    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);
    

在上面的示例中,当您从水平坐标 0 移到水平坐标 200 时,颜色分量成线性变化。 例如,如果某个点的第一个坐标位于 0 和 200 的正中间,则其蓝色分量将是 0 和 255 正中间的值。

GDI+ 可用于调整颜色从渐变的一个边缘到另一个边缘变化的方式。 假设您希望按照下表创建从黑色变到红色的渐变画笔。

水平坐标

RGB 组件

0

(0, 0, 0)

40

(128, 0, 0)

200

(255, 0, 0)

请注意,当水平坐标才达到 0 到 200 之间的 20% 时,红色分量已达到一半亮度。

下面的示例设置 LinearGradientBrush 对象的 Blend 属性,以便使三个相对亮度与三个相对位置相关联。 正如上表所示,相对亮度 0.5 与相对位置 0.2 相关联。 该代码用渐变画笔填充椭圆和矩形。

下面的插图显示所得到的椭圆和矩形。

线性渐变

自定义线性渐变

  • 将不透明黑和不透明红分别作为第三和第四个参数传递。

            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)
    
    
    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);
    

在上面的示例中,渐变的方向是水平的;即,当沿着水平线移动时,颜色逐渐变化。 还可以定义垂直渐变和对角线渐变。

下面的示例将点 (0, 0) 和点 (200, 100) 传递给 LinearGradientBrush 构造函数。 蓝色与 (0, 0) 相关联,绿色与 (200, 100) 相关联。 用线性渐变画笔填充线条(画笔的宽度为 10)和椭圆。

下面的插图显示该线条和椭圆。 请注意,当沿着任何与穿过 (0, 0) 和 (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)
    
    
    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);
    

请参见

其他资源

使用渐变画笔填充形状

Windows 窗体中的图形和绘制