System.Drawing.DrawString渲染含Emoji文本时如何显示彩色表情?
解决GDI+渲染彩色Emoji的问题
GDI+的Graphics.DrawString本身不支持渲染彩色Emoji,哪怕指定了Segoe UI Emoji字体,它只会输出单色的Emoji字形。要实现彩色Emoji渲染,可以用以下几种方法:
方法1:改用TextRenderer.DrawText(Windows平台适用)
TextRenderer基于GDI而非GDI+,原生支持彩色Emoji渲染,替换原代码即可:
var fontName = "Segoe UI Emoji"; var font = new Font(fontName, 48, FontStyle.Regular); // 定义文本绘制区域 var textRect = new Rectangle(80, 400, width - 160, height - 460); // 使用TextRenderer绘制文本,自动渲染彩色Emoji TextRenderer.DrawText( graphics, "😎 some text 🎉", font, textRect, Color.Black, Color.Transparent, TextFormatFlags.NoPrefix );
注意:
- TextRenderer的坐标系统和Graphics略有差异,可能需要微调矩形的位置参数
TextFormatFlags.NoPrefix可以避免文本中的&被识别为快捷键前缀
方法2:使用SkiaSharp(跨平台推荐)
如果需要跨平台支持,或者GDI/GDI+的方案不够稳定,推荐使用SkiaSharp库,它对彩色Emoji的支持更完善:
- 先安装SkiaSharp NuGet包:
SkiaSharp - 使用以下代码绘制:
using SkiaSharp; using System.IO; var fontName = "Segoe UI Emoji"; var text = "😎 some text 🎉"; float fontSize = 48; float xPos = 80; float yPos = 400 + fontSize; // Skia的文本绘制基准线是底部,需要调整y坐标 // 创建绘图表面 using var surface = SKSurface.Create(new SKImageInfo(width, height)); var canvas = surface.Canvas; canvas.Clear(SKColors.White); // 清空背景为白色 // 创建字体和画笔 var typeface = SKTypeface.FromFamilyName(fontName); using var skFont = new SKFont(typeface, fontSize); using var skPaint = new SKPaint { Color = SKColors.Black }; // 绘制文本(自动渲染彩色Emoji) canvas.DrawText(text, xPos, yPos, skFont, skPaint); // 保存为图片 using var image = surface.Snapshot(); using var data = image.Encode(SKEncodedImageFormat.Png, 100); using var stream = File.OpenWrite("output.png"); data.SaveTo(stream);
方法3:手动拆分Emoji并绘制(不推荐)
如果必须使用GDI+,可以手动拆分文本中的Emoji,将每个Emoji转换为图片后单独绘制,普通文本用DrawString绘制。但这种方法需要处理Emoji的检测、字形提取等逻辑,实现复杂,仅适用于特殊场景,这里不展开。
内容的提问来源于stack exchange,提问作者jcmag
相关产品推荐
相关产品推荐

