You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的支持更完善:

  1. 先安装SkiaSharp NuGet包:SkiaSharp
  2. 使用以下代码绘制:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:42:23