如何使用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
相关产品推荐
相关产品推荐

