如何在ASP.NET Core及Telegram Bot项目中运行时创建Bitmap?
在ASP.NET Core中运行时生成图片并用于Telegram机器人的解决方案
你遇到的问题核心在于System.Drawing.Common这个库的局限性:它原本仅支持Windows平台,在.NET 6及以后的非Windows环境中甚至被官方标记为过时且无法正常使用,这也是你无法顺利添加引用(或添加后会有潜在运行风险)的原因。
下面给你两个完全跨平台、适配ASP.NET Core和Telegram机器人场景的替代方案:
方案一:使用SkiaSharp(Google维护的跨平台图形库)
SkiaSharp是Google Skia图形引擎的.NET绑定,支持Windows、Linux、macOS全平台,性能稳定,非常适合服务器端生成图片的场景。
先安装必要的NuGet包:
- 基础包:
Install-Package SkiaSharp - 若部署到Linux环境,额外安装:
Install-Package SkiaSharp.NativeAssets.Linux
- 基础包:
运行时生成图片并转换为Telegram可发送的字节流示例:
using SkiaSharp; using System.IO; // 创建200x200尺寸的图片 using var bitmap = new SKBitmap(200, 200); using var canvas = new SKCanvas(bitmap); // 填充浅蓝色背景 canvas.Clear(SKColors.LightBlue); // 设置文字绘制参数 using var textPaint = new SKPaint { Color = SKColors.White, TextSize = 30, IsAntialias = true, TextAlign = SKTextAlign.Left }; // 绘制文字到画布 canvas.DrawText("Hello Telegram!", 20, 100, textPaint); // 将图片转换为PNG格式的字节流 using var ms = new MemoryStream(); bitmap.Encode(ms, SKEncodedImageFormat.Png, 100); ms.Seek(0, SeekOrigin.Begin); // 用Telegram.Bot库发送图片给用户 // await botClient.SendPhotoAsync(chatId, new InputFileStream(ms, "generated-image.png"));
方案二:使用ImageSharp(SixLabors维护的高性能图形库)
ImageSharp是一款现代的.NET图形库,API设计更直观,支持更多高级绘图特性,同样完全跨平台。
安装NuGet包:
Install-Package SixLabors.ImageSharp Install-Package SixLabors.ImageSharp.Drawing // 用于文字绘制等高级功能运行时生成图片的示例代码:
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Drawing.Processing; using SixLabors.Fonts; using System.IO; // 创建200x200的图片 using var image = new Image<Rgba32>(200, 200); image.Mutate(ctx => { // 填充背景色 ctx.BackgroundColor(Rgba32.LightBlue); // 绘制文字(使用系统默认字体) var font = SystemFonts.CreateFont("Arial", 30); ctx.DrawText("Hello Telegram!", font, Rgba32.White, new PointF(20, 70)); }); // 转换为PNG字节流 using var ms = new MemoryStream(); await image.SaveAsync(ms, new SixLabors.ImageSharp.Formats.Png.PngEncoder()); ms.Seek(0, SeekOrigin.Begin); // 发送到Telegram // await botClient.SendPhotoAsync(chatId, new InputFileStream(ms, "generated-image.png"));
重要提醒
- 不要强行使用System.Drawing.Common,除非你的项目100%只在Windows环境运行,否则部署到Linux/macOS时必然会出现运行时错误。
- 生成图片后直接通过内存流发送给Telegram,无需保存到本地文件,能大幅提升效率。
内容的提问来源于stack exchange,提问作者TheMelancholicMan




