C# LinearGradientBrush 位图垂直重复

C# LinearGradientBrush Bitmap repeating Vertically

我正在玩 Microsoft Vision API 并边学习 C#,Vision 对象的属性之一是图像的 "Accent Color"。

从分析的一系列图像中,我想显示以线性渐变排序的那些颜色——因为这将能够向用户显示大多数图片(例如)是蓝色的,因为蓝色占一半梯度等

我有这个工作,因为我按色调订购颜色,并且能够生成我正在填充到位图中的线性渐变。

但是,默认情况下渐变是水平的,我需要垂直——所以我使用了 LinearGradientBrush.RotateTransform(90) 来很好地旋转实际的渐变,但似乎并没有填满整个矩形,它会重复。这就是我得到的结果:

如何为我的位图创建一个 Vertical LinearGradient 来填充 Rectangle 对象的整个高度?

这是我的代码:

    private Bitmap CreateColorGradient(System.Drawing.Rectangle rect, System.Drawing.Color[] colors)
    {
        Bitmap gradient = new Bitmap(rect.Width, rect.Height);

        LinearGradientBrush br = new LinearGradientBrush(rect, System.Drawing.Color.White, System.Drawing.Color.White, 0, false);
        ColorBlend cb = new ColorBlend();

        // Positions
        List<float> positions = new List<float>();
        for (int i = 0; i < colors.Length; i++) positions.Add((float)i / (colors.Length - 1));
        cb.Positions = positions.ToArray();

        cb.Colors = colors;
        br.InterpolationColors = cb;
        br.RotateTransform(90);

        using (Graphics g = Graphics.FromImage(gradient))
            g.FillRectangle(br, rect);

        return gradient;
    }

感谢阅读和任何帮助——另外,如果您在我的代码中看到可以做得更好的地方,请指出,这有助于我学习 :)

您忽略了 constructor 中的 angle 参数。而当您在 Grahics 对象上进行旋转时,您的画笔矩形不再正确适合目标位图并且渐变无法填充它;所以它重复。

更正

  • 只需将角度设置为90
  • 删除 br.RotateTransform(90); 调用。

此处将结果从左侧更改为中间版本:

在我们查看它的同时,请注意 LinearGradientBrushWrapMode 属性。您在第一张图片中看到的是默认值 WrapMode.Clamp。通常更改为其中一种翻转模式会有所帮助。所以让我们看看第一个版本在正确位置的影响。

它看起来像 WrapMode.TileFlipY 但由于我已经恢复了旋转,它实际上需要一个值 WrapMode.TileFlipXWrapMode.TileFlipXYbr.WrapMode = WrapMode.TileFlipX;