使用PathGradientBrush进行颜色混合

时间:2014-06-12 05:55:34

标签: c# winforms gdi+

我一直坚持这个问题几个小时但似乎无法取得进展。我正在尝试绘制一个矩形,如下所示

enter image description here

带有浅灰色边框线。我成功地绘制了灰色边框线矩形,但我无法填充矩形。 有9种颜色,我希望它们在我的矩形宽度上具有相同的空间。

我的代码如下所示

            using (var gp = new GraphicsPath())
            {
                gp.AddRectangle(rect);

                using (var pgb = new PathGradientBrush(gp))
                {
                    var pos = new[] { 0f, .125f, .25f, .375f, .5f, .625f, .75f, .875f, 1f };
                    var b = new Blend
                                 {
                                     Positions = pos,
                                     Factors = new[] { .125f, .125f, .125f, .125f, .125f, .125f, .125f, .125f, .125f }
                                 };
                    var cb = new ColorBlend
                    {
                        Positions = pos,
                        Colors = new[]
                                                   {
                                                       Color.FromArgb(0, 0, 0),
                                                       Color.FromArgb(0, 0, 79),
                                                       Color.FromArgb(81, 0, 123),
                                                       Color.FromArgb(152, 0, 118),
                                                       Color.FromArgb(211, 0, 62),
                                                       Color.FromArgb(245, 31, 0),
                                                       Color.FromArgb(255, 175, 0),
                                                       Color.FromArgb(255, 255, 100),
                                                       Color.FromArgb(255, 255, 255),
                                                   }
                    };

                    pgb.Blend = b;
                    pgb.InterpolationColors = cb;
                    pgb.CenterPoint = new PointF(rect.Width / 2, rect.Height / 2);
                    pgb.FocusScales = new PointF(.5f, .5f);
                    bufferedGraphics.Graphics.FillPath(pgb, gp);
                }
            }

但这最终会产生 enter image description here 请忽略两个图形的不一致大小。

这可能吗?如果可以,我怎样才能改变我的方法来实现这个目标?

1 个答案:

答案 0 :(得分:4)

不使用PathGradientBrush,而是使用LinearGradientBrush,因为您想在直线块中绘制颜色。而且(至少对我来说)更容易理解会发生什么。

我在框架2.0项目中尝试了以下代码,很抱歉删除了C#4.0语法。

        using (LinearGradientBrush lgb = new LinearGradientBrush(rect, Color.Black, Color.White, 0f)) {
            float[] pos = new float[] { 0f, .125f, .25f, .375f, .5f, .625f, .75f, .875f, 1f };
            Blend b = new Blend();
            b.Positions = pos;
            b.Factors = new float[] { .125f, .125f, .125f, .125f, .125f, .125f, .125f, .125f, .125f };
            ColorBlend cb = new ColorBlend();
            cb.Positions = pos;
            cb.Colors = new Color[] {
                Color.FromArgb(0, 0, 0),
                Color.FromArgb(0, 0, 79),
                Color.FromArgb(81, 0, 123),
                Color.FromArgb(152, 0, 118),
                Color.FromArgb(211, 0, 62),
                Color.FromArgb(245, 31, 0),
                Color.FromArgb(255, 175, 0),
                Color.FromArgb(255, 255, 100),
                Color.FromArgb(255, 255, 255),
            };
            lgb.Blend = b;
            lgb.InterpolationColors = cb;
            e.Graphics.FillRectangle(lgb, rect);
        }

结果:

enter image description here