我正在使用Microsoft Vision API并在学习C#,并且Vision对象的属性之一是图像的“强调色”。
从一系列分析的图像中,我想显示线性渐变中排列的那些颜色-因为这将能够向用户显示大多数图片(例如)是蓝色的,因为蓝色占据了渐变的一半等。
我正在进行此工作,因为我正在订购Hue的“颜色”,并能够产生线性渐变,所以我要填充到位图中。
但是,默认情况下渐变是“水平”,而我需要“垂直”,因此我使用了LinearGradientBrush.RotateTransform(90)可以将实际的渐变精细旋转,但似乎无法填充整个Rectangle并重复进行。这就是我得到的结果:
如何创建一个垂直的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);
调用。
在这里,这会将结果从左侧更改为中间版本:
在查看时,请注意WrapMode
的LinearGradientBrush
属性。在第一张图像中看到的是默认的WrapMode.Clamp
。通常,将其更改为翻转模式会有所帮助。.因此,让我们来看看它在第一个版本正确的位置上的影响。
看起来像WrapMode.TileFlipY
,但是由于我已恢复旋转,因此它实际上需要一个值WrapMode.TileFlipX
或WrapMode.TileFlipXY
:br.WrapMode = WrapMode.TileFlipX;