在 .Net 中用笔划将文本绘制到图像上
我目前正在使用 .Net 中的 System.Drawing.Graphics.DrawString() 方法在图像顶部绘制文本,然后将其保存到新文件中:
// define image file paths
string sourceImagePath = HttpContext.Current.Server.MapPath("~/img/sourceImage.jpg");
string destinationImagePath = HttpContext.Current.Server.MapPath("~/img/") + "finalImage.jpg";
// create new graphic to draw to
Bitmap bm = new Bitmap(200, 200);
Graphics gr = Graphics.FromImage(bm);
// open and draw image into new graphic
System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(sourceImagePath, true);
gr.DrawImage(sourceImage, 0, 0);
sourceImage.Dispose();
// write "my text" on center of image
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
PrivateFontCollection fontCollection = new PrivateFontCollection();
fontCollection.AddFontFile(HttpContext.Current.Server.MapPath("~/fonts/HelveticaNeueLTStd-BlkCn.ttf"));
// prototype (1)
gr.DrawString("my text", new Font(fontCollection.Families[0], 14, FontStyle.Bold), new SolidBrush(Color.FromArgb(255, 255, 255)), 100, 0, sf);
fontCollection.Dispose();
// save new image
if (File.Exists(destinationImagePath))
{
File.Delete(destinationImagePath);
}
bm.Save(destinationImagePath);
bm.Dispose();
gr.Dispose();
这种在图像上添加文本的方法没有提供一种方法(据我所知)向文本添加笔画。例如,我真正需要做的是向图像上写入的文本添加某种颜色的 2px 描边。
如何使用 .Net Framework <= v3.5 来完成此操作?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
所有文本均具有笔画。
如果您所说的描边指的是轮廓,则创建一个
GraphicsPath
并使用AddString
,然后您可以使用 DrawPath 而不是 msdn 上的示例中使用的FillPath
来勾画路径。如果您所说的笔画是指罢工,则使用删除线 字体样式。
如果笔划是指 serif,则使用不同的字体。
All text has strokes.
If by stroke you mean outline, then you create a
GraphicsPath
and add the string usingAddString
, you can then outline the path using DrawPath rather thanFillPath
as used in the example on msdn.If by stroke you mean strike, then use the Strikeout font style.
If by stroke you mean serif, then use a different font.
有点黑客,但您可以将两组文本一组放在另一组之上,下层稍微放大。可能不适用于所有字体,但值得一试。
A bit of a hack, but you could layer two sets of text one atop the other, with the lower layer scaled up just slightly. Might not work perfectly for all fonts but it's worth a try.
不确定这是否正是您正在寻找的,但请尝试使用 LinearGradientBrush 而不是
SolidBrush
。我不确定这个问题中的“描边”是什么意思,但是如果您希望第 7 行和第 8 行上的所有像素均为红色,则可以使用 System.Drawing.TextureBrush而不是
SolidBrush
。您将创建一个Bitmap
,其宽度和高度足以容纳您的字体(除了第 7 行和第 8 行为红色之外,全部为黑色),然后使用TextureBrush
的构造函数将此位图作为参数。Not sure if this is exactly what you're looking for, but try using a LinearGradientBrush instead of a
SolidBrush
in your code.I'm not sure what you mean by "stroke" in this question, but if you want, say, all pixels on rows 7 and 8 to be red, you can use a
System.Drawing.TextureBrush
instead of aSolidBrush
. You would create aBitmap
one pixel wide and tall enough for your font (all black except for rows 7 and 8 which would be red), and then use the constructor forTextureBrush
that takes thisBitmap
as a parameter.