我正在使用Microsoft Vision API并学习C#,而Vision对象的一个属性是" Accent Color"图像。
从分析的一系列图像中,我想要显示在线性渐变中排序的那些颜色 - 因为这将能够向用户显示大多数图片是(例如)蓝色,因为蓝色占用的一半渐变等。
我有这个工作,因为我按顺序排序颜色,并且能够生成线性渐变我填充到位图。
但是,默认情况下,渐变是水平的,我需要垂直 - 所以我使用了 LinearGradientBrush.RotateTransform(90)来旋转实际的渐变,但是没有。似乎填满整个矩形,它重复。这就是我得到的结果:
如何创建一个垂直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;
}
感谢阅读和任何帮助 - 如果您在我的代码中看到可以做得更好的内容,请指出它有助于我学习:)
答案 0 :(得分:3)
您忽略了constructor中的angle
参数。而当您在Grahics对象上进行旋转时,您的画笔矩形不再正确地适合目标位图,并且渐变无法填充它;所以它重复。
纠正
90
和br.RotateTransform(90);
来电。这里将结果从左侧更改为中间版本:
虽然我们正在查看它,但请注意WrapMode
的{{1}}属性。您在第一张图片中看到的内容是默认LinearGradientBrush
。通常情况下,更改为翻转模式之一有助于..所以让我们看一下第一个版本在正确位置的影响。
它看起来像WrapMode.Clamp
但是由于我带回了轮换,它实际上需要值WrapMode.TileFlipY
或WrapMode.TileFlipX
:
WrapMode.TileFlipXY