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);
调用。
此处将结果从左侧更改为中间版本:
在我们查看它的同时,请注意 LinearGradientBrush
的 WrapMode
属性。您在第一张图片中看到的是默认值 WrapMode.Clamp
。通常更改为其中一种翻转模式会有所帮助。所以让我们看看第一个版本在正确位置的影响。
它看起来像 WrapMode.TileFlipY
但由于我已经恢复了旋转,它实际上需要一个值 WrapMode.TileFlipX
或 WrapMode.TileFlipXY
:
br.WrapMode = WrapMode.TileFlipX;
我正在玩 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);
调用。
此处将结果从左侧更改为中间版本:
在我们查看它的同时,请注意 LinearGradientBrush
的 WrapMode
属性。您在第一张图片中看到的是默认值 WrapMode.Clamp
。通常更改为其中一种翻转模式会有所帮助。所以让我们看看第一个版本在正确位置的影响。
它看起来像 WrapMode.TileFlipY
但由于我已经恢复了旋转,它实际上需要一个值 WrapMode.TileFlipX
或 WrapMode.TileFlipXY
:
br.WrapMode = WrapMode.TileFlipX;