如何从原始区域填充线性渐变画笔区域?

时间:2015-03-13 04:44:12

标签: c# gdi+

我正在使用LinearGradient画笔来填充区域,我使用起点和终点Color创建了linearGradient画笔。

  Rectangle linearGradientregion= new Rectangl(20,-50,30,30);
  LinearGradientBrush linearGradientBrush = new LinearGradientBrush(new PointF(20, -20), new PointF(50, -50), Color.Green, Color.Red);


  Rectangle pathRegion= new Rectangl(-50,-25,50,50);
  GraphicsPath path = new GraphicsPath();
  path.AddRectangle(pathRegion);
  graphics.FillPath(linearGradientBrush, path);

区域大小大于linearGradientBrush边界区域。

现在我想知道如何仅使用linearGradientBrush使用linearGradientBrush边界区域来填充区域,并使用另一种颜色填充区域中的剩余区域。

下图是期望输出。

   http://i.stack.imgur.com/B4CHB.png

但我得到了这样的结果

  http://i.stack.imgur.com/Pxwiw.png

在第一张图片中,填充绿色的圆圈超出了线性渐变画笔的界限。

在第二张图像中,渐变画笔再次填充该区域。

我想在线性渐变画笔的终点处停止渐变画笔填充,并用另一种颜色填充剩余区域。

提前致谢,

Parthi

2 个答案:

答案 0 :(得分:1)

要填充渐变,您必须指定确切区域以填充。在你的情况下,我相信这是linearGradientregion

graphics.FillRectangle(linearGradientBrush, linearGradientregion);

要填充剩余区域,请使用alternate fill mode中的GraphicsPath(默认值)。将两个矩形添加到路径中,然后将填充外部形状并将剪切区域外部的内部形状单独留下。例如:

using(var externalPath = new GraphicsPath(FillMode.Alternate))
{
    externalPath.AddRectangle(pathRegion);
    externalPath.AddRectangle(linearGradientregion);

    graphics.FillPath(Brushes.Black, externalPath);
}

答案 1 :(得分:1)

有几种方法可以完成这项任务:

  • 您可以分两步完成,首先填充圆圈,然后填充三角形,将圆圈设置为ClippingPath对象的Graphics.SetClip(path)Graphics)。

  • 您可以分两步完成,首先按角度旋转Graphics对象,然后填充圆圈然后再填充Rectangle,再次将圆圈设置为ClippingPath Graphics对象。最后回头。

  • 或者您可以一步完成:创建多色 LinearGradientBrush,并设置位置,使绿色区域从无过渡旁边开始。

以下是使用第三种方法(左图)和第二种方法(右图)的两种解决方案:

enter image description here enter image description here

解决方案一使用带有多色渐变的第三种方法:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.Clear(Color.White);
    e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
    Rectangle linearGradientregion = new Rectangle(10, 10, 150, 150);
    Rectangle pathRegion = new Rectangle(15, 15, 140, 140);
    GraphicsPath path = new GraphicsPath();
    path.AddEllipse(pathRegion);
    LinearGradientBrush linearGradientBrush = 
       new LinearGradientBrush(linearGradientregion, Color.Red, Color.Yellow, 45);

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

    linearGradientBrush.InterpolationColors = cblend;

    e.Graphics.FillPath(linearGradientBrush, path);
}

请注意,我没有使用您的坐标设置..我相信您可以调整数字。

另请注意,Colors未使用构造函数中的Brush

使用第二种方法

解决方案二。注意到绿色的急剧转变:

private void panel3_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.Clear(Color.White);
    e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
    Rectangle linearGradientregion = new Rectangle(10, 10, 95, 95);
    Rectangle pathRegion = new Rectangle(15, 15, 140, 140);
    int centerX = pathRegion.X + pathRegion.Width / 2;
    int centerY = pathRegion.Y + pathRegion.Height / 2;

    GraphicsPath path = new GraphicsPath();
    path.AddEllipse(pathRegion);
    LinearGradientBrush linearGradientBrush = 
        new LinearGradientBrush(linearGradientregion, Color.Red, Color.Yellow, 45);
    e.Graphics.FillPath(linearGradientBrush, path);
    e.Graphics.SetClip(path);

    e.Graphics.TranslateTransform(centerX, centerY);
    e.Graphics.RotateTransform(45f);
    e.Graphics.FillRectangle(Brushes.Green, 25, -90, 240, 240);
    e.Graphics.ResetTransform();
}

再次由你决定最好的数字..