我正在使用Microsoft Vision API并在学习C#,并且Vision对象的属性之一是图像的“强调色”。

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

我正在进行此工作,因为我正在订购Hue的“颜色”,并能够产生线性渐变,所以我要填充到位图中。

但是,默认情况下渐变是“水平”,而我需要“垂直”,因此我使用了LinearGradientBrush.RotateTransform(90)可以将实际的渐变精细旋转,但似乎无法填充整个Rectangle并重复进行。这就是我得到的结果:

c# - C#LinearGradientBrush位图垂直重复-LMLPHP

如何创建一个垂直的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);调用。


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

c# - C#LinearGradientBrush位图垂直重复-LMLPHP c# - C#LinearGradientBrush位图垂直重复-LMLPHP c# - C#LinearGradientBrush位图垂直重复-LMLPHP

在查看时,请注意WrapModeLinearGradientBrush属性。在第一张图像中看到的是默认的WrapMode.Clamp。通常,将其更改为翻转模式会有所帮助。.因此,让我们来看看它在第一个版本正确的位置上的影响。

看起来像WrapMode.TileFlipY,但是由于我已恢复旋转,因此它实际上需要一个值WrapMode.TileFlipXWrapMode.TileFlipXY
br.WrapMode = WrapMode.TileFlipX;

10-08 09:02