You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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全平台,性能稳定,非常适合服务器端生成图片的场景。

  1. 先安装必要的NuGet包:

    • 基础包:Install-Package SkiaSharp
    • 若部署到Linux环境,额外安装:Install-Package SkiaSharp.NativeAssets.Linux
  2. 运行时生成图片并转换为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设计更直观,支持更多高级绘图特性,同样完全跨平台。

  1. 安装NuGet包:

    Install-Package SixLabors.ImageSharp
    Install-Package SixLabors.ImageSharp.Drawing  // 用于文字绘制等高级功能
    
  2. 运行时生成图片的示例代码:

    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

火山引擎 最新活动