C#开发Telegram Bot:如何不存盘直接发送合成Bitmap?
直接在内存中生成图片并通过Telegram Bot发送(无需保存到磁盘)
没问题,我帮你搞定这个需求——不用把生成的图片存到本地磁盘,直接在内存里处理完就发给Telegram Bot完全可以实现,核心就是把Bitmap转成内存流,再传给Telegram的接口。
核心思路
我们可以把最终生成的finalImage写入到MemoryStream(内存流)中,然后把流的位置重置到起始点,再用Telegram Bot的SendPhotoAsync或SendDocumentAsync接口发送这个内存流即可,全程不需要碰磁盘。
修改后的完整代码示例
using System.Drawing; using System.Drawing.Imaging; using System.IO; using Telegram.Bot; using Telegram.Bot.Types.InputFiles; // 假设你已经初始化了botClient和获取了chatId var botClient = new TelegramBotClient("你的BotToken"); long yourChatId = 123456789; // 替换成实际的聊天ID using (Bitmap speedometer = new Bitmap(@"C:\Immagini\bot\speedometer.png")) using (Bitmap pointer = new Bitmap(@"C:\Immagini\bot\pointer.png")) using (Bitmap finalImage = new Bitmap(speedometer)) using (Graphics graphics = Graphics.FromImage(finalImage)) { // 旋转指针并绘制到仪表盘上 using (Bitmap rotatedPointer = RotateImage(pointer, efficienza_int * (float)1.8)) { rotatedPointer.MakeTransparent(Color.White); graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; graphics.DrawImage(rotatedPointer, 0, 0); } // 将Bitmap写入内存流 using (MemoryStream ms = new MemoryStream()) { finalImage.Save(ms, ImageFormat.Png); ms.Position = 0; // 必须重置流的位置到开头,否则Telegram读不到内容 // 调用SendPhotoAsync发送图片(会直接预览) await botClient.SendPhotoAsync( chatId: yourChatId, photo: new InputFileStream(ms, "speedometer.png") // 第二个参数是文件名,用于识别文件类型 ); // 如果想用SendDocumentAsync发送(当成文件),替换成下面的代码: // await botClient.SendDocumentAsync( // chatId: yourChatId, // document: new InputFileStream(ms, "speedometer.png") // ); } }
几个关键注意点
- 重置流位置:调用
finalImage.Save(ms, ...)后,流的位置会停在末尾,一定要设置ms.Position = 0,否则Telegram的接口会读取空内容。 - 资源释放:把所有
Bitmap和MemoryStream都放到using语句里,这样系统会自动释放资源,避免内存泄漏。 - 文件类型指定:
InputFileStream的第二个参数是文件名,后缀要正确(比如.png),这样Telegram才能识别图片格式。
内容的提问来源于stack exchange,提问作者Manuel Valente Mysteriis
相关产品推荐
相关产品推荐

