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

如何使用SkiaSharp在现有Base64图片上叠加文字 代码仅返回原图问题排查

问题排查及修复方案

常见错误原因

  • SKBitmap 不可写:SKBitmap.Decode 方法返回的 bitmap 可能为只读状态,这种状态下绘制操作会被静默忽略,不会抛出异常,是该问题最常见的诱因。
  • 文字超出画布范围:DrawText 方法的Y坐标对应文字基线位置,若你的原始图片高度小于30px,文字会直接绘制到画布外部无法显示。
  • 文字尺寸过小:10px的文字尺寸极小,若原始图片分辨率较高,文字会几乎不可见,被误认为没有绘制成功。
  • 颜色重叠:如果原始图片对应绘制区域本身就是黑色,黑色文字会完全融合无法分辨。

修复后代码

var signatureData = Convert.FromBase64String(signature);
// 增加using自动释放非托管资源,避免内存泄漏
using var stream = new MemoryStream(signatureData);
using var originBitmap = SKBitmap.Decode(stream);

// 强制创建可写的新Bitmap,彻底解决原Bitmap只读导致绘制失效的问题
using var writableBitmap = new SKBitmap(originBitmap.Width, originBitmap.Height);
using var canvas = new SKCanvas(writableBitmap);
// 先把原始图片绘制到新的可写画布上
canvas.DrawBitmap(originBitmap, 0, 0);

var paint = new SKPaint
{
    // 调大文字尺寸,可根据实际图片分辨率自适应调整
    TextSize = 30,
    IsAntialias = true,
    // 测试阶段可先用高对比度颜色,避免和原图底色冲突,确认生效后再改回目标颜色
    Color = SKColors.Red,
    IsStroke = false,
    Typeface = SKTypeface.Default // 显式指定字体,避免缺字问题
};

// 调整Y坐标为文字尺寸大小,避免文字顶部超出画布范围
var origin = new SKPoint(10, paint.TextSize);
paint.TextAlign = SKTextAlign.Left;
canvas.DrawText("text", origin, paint);

canvas.Flush();
using var resultImage = SKImage.FromBitmap(writableBitmap);
using var data = resultImage.Encode(SKEncodedImageFormat.Png, 100);
return Convert.ToBase64String(data.ToArray());

验证方法

首次测试建议把文字尺寸调到50以上、颜色设为红色,运行后如果能看到高对比度的红色文字,再根据需求调整文字的尺寸、颜色、坐标即可。

内容的提问来源于stack exchange,提问作者Tes Nov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:57:03