C#LinearGradientBrush位图重复垂直

时间:2016-05-28 18:55:34

标签: c# winforms colors bitmap gradient

我正在使用Microsoft Vision API并学习C#,而Vision对象的一个​​属性是" Accent Color"图像。

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

我有这个工作,因为我按顺序排序颜色,并且能够生成线性渐变我填充到位图。

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

enter image description here

如何创建一个垂直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;
    }

感谢阅读和任何帮助 - 如果您在我的代码中看到可以做得更好的内容,请指出它有助于我学习:)

1 个答案:

答案 0 :(得分:3)

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

纠正

  • 只需将角度设置为90
  • 即可
  • 删除br.RotateTransform(90);来电。

这里将结果从左侧更改为中间版本:

enter image description here enter image description here enter image description here

虽然我们正在查看它,但请注意WrapMode的{​​{1}}属性。您在第一张图片中看到的内容是默认LinearGradientBrush。通常情况下,更改为翻转模式之一有助于..所以让我们看一下第一个版本在正确位置的影响。

它看起来像WrapMode.Clamp但是由于我带回了轮换,它实际上需要值WrapMode.TileFlipYWrapMode.TileFlipXWrapMode.TileFlipXY