我需要将包含 Unicode 字符的文本转换为也可以具有透明背景的位图。
我发现并尝试了不同的帖子,例如this https://stackoverflow.com/questions/18838037/drawing-text-to-a-bitmap-with-textrenderer, this https://stackoverflow.com/questions/6311545/c-sharp-write-text-on-bitmap, or this https://stackoverflow.com/questions/17348042/converting-from-string-to-image-in-c-sharp,但似乎没有人为我工作。
我还发现这个帖子 https://stackoverflow.com/a/4128985/4396321这建议使用TextRenderer.DrawText()方法而不是System.Drawing.Graphics.DrawString()但最终的结果无论如何都不好。
这是一个代码片段:
private static Bitmap ImageFromText(string text, Font font, Color textColor, Color fillColor, System.Drawing.Graphics graphics)
{
Bitmap bmpOut;
SizeF sz = TextRenderer.MeasureText(graphics, text, font);
//SizeF sz = g.MeasureString(text, font);
if (sz.IsEmpty)
sz = new SizeF(1, 1);
bmpOut = new Bitmap((int) Math.Ceiling(sz.Width), (int) Math.Ceiling(sz.Height), PixelFormat.Format32bppArgb);
using (System.Drawing.Graphics gBmp = System.Drawing.Graphics.FromImage(bmpOut))
{
gBmp.Clear(fillColor);
gBmp.SmoothingMode = SmoothingMode.HighQuality;
gBmp.InterpolationMode = InterpolationMode.HighQualityBilinear;
gBmp.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
//gBmp.DrawString(text, font, brFore, 0, 0); // Unicode chars are not supported
TextRenderer.DrawText(gBmp, text, font, new Point(0, 0), textColor);
}
return bmpOut;
}
这是我的测试代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
string testString = "Unicode Title \uD83E\uDC25";
var font = new Font(new FontFamily("Microsoft Sans Serif"), 12.375f);
// e.Graphics.DrawString(testString, new Font(font.FontFamily, 20), new SolidBrush(Color.Black), 0, 0);
TextRenderer.DrawText(e.Graphics, testString, new Font ( font.FontFamily, 20 ), new Point(0, 50), Color.Black);
Bitmap bitmap = ImageFromText(testString, new Font(font.FontFamily, 20), Color.Black, this.BackColor, e.Graphics);
e.Graphics.DrawImage(bitmap, new Point(0, 100));
//Clipboard.SetImage(bitmap);
}
}
这是糟糕的结果:
如何改善位图结果?
EDIT
简短回顾:
- 我无法使用 System.Drawing.Graphics.DrawString() 方法,因为它不支持 Unicode 字符
- 我无法使用 TextRenderer.DrawText() 方法,因为 TextRenderer 类使用 GDI 并且它不支持 alpha,因此它不支持透明背景。
还有其他方法可以实现我的目标吗?