带有硬颜色过渡的.NET笔刷(类似于渐变)

带有硬颜色过渡的.NET笔刷(类似于渐变),.net,gdi+,brush,lineargradientbrush,.net,Gdi+,Brush,Lineargradientbrush,我需要一个单色画笔,它将从一种颜色硬过渡到下一种颜色,如下所示。我提供了另一个控件的填充笔刷,所以我需要一个笔刷对象 我想要的是: 我尝试了几种方法(见下面的一个例子),但没有产生强硬的路线;过渡仍然是渐变,线条模糊 LinearGradientBrush brush = new LinearGradientBrush(pictureBox1.ClientRectangle, Color.Green, Color.Silver, 0f); Blend blend = new Blend();

我需要一个单色画笔,它将从一种颜色硬过渡到下一种颜色,如下所示。我提供了另一个控件的填充笔刷,所以我需要一个笔刷对象

我想要的是:

我尝试了几种方法(见下面的一个例子),但没有产生强硬的路线;过渡仍然是渐变,线条模糊

LinearGradientBrush brush = new LinearGradientBrush(pictureBox1.ClientRectangle, Color.Green, Color.Silver, 0f);
Blend blend = new Blend();
blend.Factors = new float[] { 0, 0, 1, 1 };
blend.Positions = new float[] { 0, .7f, .7f, 1 };
brush.Blend = blend;
我得到的是:


如何定义一个画笔来完成此操作?

为此,您可能需要使用
TexureBrush

TextureBrush
将图像作为参数,这意味着您可以从光盘加载现有图像,也可以在内存中创建图像,然后绘制矩形等

在下面的示例中,GetTextureBrush将创建实际的笔刷。这里是定义颜色和形状的地方。我只是在你需要的地方创造了一些东西,根据需要进行调整

例如(VB.net):

C#


只要把链接放在帖子里,我就可以帮你把它内联起来。不需要再重复了,当我尝试这个的时候,我会变得很强硬。注意缩放,修补PixelOffsetMode。不确定我最初的方法为什么不起作用,但给猫去皮的方法不止一种。这解决了我的问题!谢谢
Private Sub DrawBrush()

    Dim g As Graphics = Me.CreateGraphics
    Dim bmp As Image = GetTexureBrush
    Dim b As New TextureBrush(bmp)

    g.FillRectangle(b, New Rectangle(0, 0, 200, 500))

    b.Dispose()
    bmp.Dispose()
    g.Dispose()

End Sub
Private Function GetTexureBrush() As Image

    Dim bmp As New Bitmap(100, 20)
    Dim g As Graphics = Graphics.FromImage(bmp)

    g.FillRectangle(Brushes.DarkGreen, New Rectangle(0, 0, 75, 20))
    g.FillRectangle(Brushes.Gray, New Rectangle(75, 0, 25, 20))

    g.Dispose()

    Return bmp

End Function
private void DrawBrush()
{
    Graphics g = this.CreateGraphics;
    Image bmp = GetTexureBrush();
    TextureBrush b = new TextureBrush(bmp);

    g.FillRectangle(b, new Rectangle(0, 0, 200, 500));

    b.Dispose();
    bmp.Dispose();
    g.Dispose();

}
private Image GetTexureBrush()
{

    Bitmap bmp = new Bitmap(100, 20);
    Graphics g = Graphics.FromImage(bmp);

    g.FillRectangle(Brushes.DarkGreen, new Rectangle(0, 0, 75, 20));
    g.FillRectangle(Brushes.Gray, new Rectangle(75, 0, 25, 20));

    g.Dispose();

    return bmp;

}