如何用 2 个不同的 color/texture 填充文本
How to fill text with 2 different color/texture
我使用 Path.Addstring 在图像顶部绘制文本并用颜色填充它,效果非常好。现在我想垂直拆分(平分)文本并有 2 种不同的颜色或纹理。例如。文本的上半部分使用实心画笔,下半部分使用阴影画笔。我想知道这是否可行以及我应该以哪种方式实现它。
使用 paint.net 软件创建的参考图像。我画了一条线来分割文本,并用不同的纹理填充底部。
*我不希望该行在最终输出中可见。
可能。
- 用实心画笔填充路径。
- 通过
GraphicsPath.GetBounds
方法获取路径边界矩形
- 调用
Graphics.SetClip
方法排除矩形的上半部分。
- 用
TextureBrush
或 HatchBrush
填充路径。
使用 HatchBrush 填充路径的第二个垂直部分的示例。
private void SomeControl_Paint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
var r = (sender as Control).ClientRectangle;
using (var gp = new GraphicsPath())
using (var sf = new StringFormat())
using (var fnt = new Font("Blackoak Std", 72))
using (var hbr = new HatchBrush(HatchStyle.Percent25, Color.White, Color.Red))
{
sf.Alignment = sf.LineAlignment = StringAlignment.Center;
gp.AddString("RED", fnt.FontFamily, (int)fnt.Style, GetEmFontSize(fnt), r, sf);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.FillPath(Brushes.Red, gp);
var rf = gp.GetBounds();
rf.Height /= 2f;
g.SetClip(rf, CombineMode.Exclude);
g.FillPath(hbr, gp);
g.ResetClip();
g.SmoothingMode = SmoothingMode.None;
}
}
private float GetEmFontSize(Font fnt) =>
fnt.SizeInPoints * (fnt.FontFamily.GetCellAscent(fnt.Style) +
fnt.FontFamily.GetCellDescent(fnt.Style)) / fnt.FontFamily.GetEmHeight(fnt.Style);
另请参阅其他 HatchStyle 值。
我使用 Path.Addstring 在图像顶部绘制文本并用颜色填充它,效果非常好。现在我想垂直拆分(平分)文本并有 2 种不同的颜色或纹理。例如。文本的上半部分使用实心画笔,下半部分使用阴影画笔。我想知道这是否可行以及我应该以哪种方式实现它。
使用 paint.net 软件创建的参考图像。我画了一条线来分割文本,并用不同的纹理填充底部。
*我不希望该行在最终输出中可见。
可能。
- 用实心画笔填充路径。
- 通过
GraphicsPath.GetBounds
方法获取路径边界矩形 - 调用
Graphics.SetClip
方法排除矩形的上半部分。 - 用
TextureBrush
或HatchBrush
填充路径。
使用 HatchBrush 填充路径的第二个垂直部分的示例。
private void SomeControl_Paint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
var r = (sender as Control).ClientRectangle;
using (var gp = new GraphicsPath())
using (var sf = new StringFormat())
using (var fnt = new Font("Blackoak Std", 72))
using (var hbr = new HatchBrush(HatchStyle.Percent25, Color.White, Color.Red))
{
sf.Alignment = sf.LineAlignment = StringAlignment.Center;
gp.AddString("RED", fnt.FontFamily, (int)fnt.Style, GetEmFontSize(fnt), r, sf);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.FillPath(Brushes.Red, gp);
var rf = gp.GetBounds();
rf.Height /= 2f;
g.SetClip(rf, CombineMode.Exclude);
g.FillPath(hbr, gp);
g.ResetClip();
g.SmoothingMode = SmoothingMode.None;
}
}
private float GetEmFontSize(Font fnt) =>
fnt.SizeInPoints * (fnt.FontFamily.GetCellAscent(fnt.Style) +
fnt.FontFamily.GetCellDescent(fnt.Style)) / fnt.FontFamily.GetEmHeight(fnt.Style);
另请参阅其他 HatchStyle 值。