代码之家  ›  专栏  ›  技术社区  ›  Manuel Valente Mysteriis

电报机器人C#-发送对象位图

  •  -1
  • Manuel Valente Mysteriis  · 技术社区  · 6 年前

    我必须“生成”一个png文件,并通过SeendDocumentAsync的SendPhotoAsync将其发送给Telegram机器人。

    这是我的C代码:

    ...
    Bitmap speedometer = new Bitmap(@"C:\Immagini\bot\speedometer.png");
    Bitmap pointer = new Bitmap(@"C:\Immagini\bot\pointer.png");
    Bitmap finalImage = new Bitmap(speedometer);
    using (Graphics graphics = Graphics.FromImage(finalImage))
    {
        Bitmap rotatedPointer = RotateImage(pointer, efficienza_int * (float)1.8);
        rotatedPointer.MakeTransparent(Color.White);
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.DrawImage(rotatedPointer, 0, 0);
        ?????????????
    }
    

    现在,我想发送finalImage,而不使用Save方法将其保存在磁盘上。 我该怎么办?

    谢谢你的建议!

    3 回复  |  直到 6 年前
        1
  •  3
  •   Nyerguds    3 年前

    将其保存到 MemoryStream ,并发送 内存流 在对机器人的呼叫中,如下所示:

    using (MemoryStream ms = new MemoryStream())
    using (Bitmap finalImage = new Bitmap(speedometer))
    {
        using (Graphics graphics = Graphics.FromImage(finalImage))
        {
            // ... stuff
        }
        finalImage.Save(ms, ImageFormat.Png);
        // This is important: otherwise anything reading the stream
        // will start at the point AFTER the written image.
        ms.Position = 0;
        Bot.SendPhotoAsync(/* send 'ms' here. Whatever the exact args are */);
    }
    

    异步发送可能要求流保持打开状态。不过,通常情况下,当您有这样一个异步发送时,您可以指定一个应该在发送完成后调用的函数。

    那样的话,你应该 内存流 在a中 using 块,而是将流对象存储在类中的全局变量中,并确保处理异步发送结束的函数处理它。

    还要注意这个问题。。。

    bot.sendphoto does not work asp.net

    显然地 SendPhotoAsync 不足以实际发送;那里的答案说明你需要打电话 .GetAwaiter() .GetResult() 。我不知道API,所以你必须自己弄清楚。

        2
  •  0
  •   Matteo    6 年前

    来自Telegram Bot API文档( link )

    正在发送文件 有三种发送文件的方式(照片、贴纸、音频、媒体等):

    。。。

    1. 以通过浏览器上载文件的通常方式,使用多部分/表单数据发布文件。照片最大大小为10 MB,其他文件最大大小为50 MB。
        3
  •  0
  •   Alaa Masalmeh    6 年前

    你的问题不清楚! 然而,(如果我正确理解你的问题) 您正在使用此存储库中的TelgramBotClient: https://github.com/TelegramBots

    从该客户端调用SendPhotoAsync时,它将FileToSend作为一个参数,该参数表示使用旋转、透明度和平滑处理的照片。

    当您将此文件传递到发送时,您可以通过从处理后创建的临时文件加载照片来设置照片,也可以通过如下方式从MemoryStream加载照片目录:

    using System.Drawing;
    using System.Drawing.Drawing2D;
    using Telegram.Bot;
    using Telegram.Bot.Args;
    using System.IO;
    using System.Drawing.Imaging;
    
    namespace LoadGraphicsFromMemory
    {
        public static class ImageExtensions
        {
            public static MemoryStream ToMemoryStream(this Bitmap image, ImageFormat format)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    image.Save(ms, format);
                    return ms;
                }
            }
    
        }
    
        class Program
        {
            private static float efficienza_int;
            private static readonly TelegramBotClient Bot = new TelegramBotClient("Your API key");
    
            static void Main(string[] args)
            {
    
    
                Bot.OnMessage += BotOnMessageReceived;
            }
    
            private static void BotOnMessageReceived(object sender, MessageEventArgs e)
            {
                Bitmap speedometer = new Bitmap(@"C:\Immagini\bot\speedometer.png");
                Bitmap pointer = new Bitmap(@"C:\Immagini\bot\pointer.png");
                Bitmap finalImage = new Bitmap(speedometer);
                using (Graphics graphics = Graphics.FromImage(finalImage))
                {
                    Bitmap rotatedPointer = RotateImage(pointer, efficienza_int * (float)1.8);
                    rotatedPointer.MakeTransparent(Color.White);
                    graphics.SmoothingMode = SmoothingMode.HighQuality;
                    graphics.DrawImage(rotatedPointer, 0, 0);
    
                }
    
                Bot.SendPhotoAsync(e.Message.Chat.Id, new Telegram.Bot.Types.FileToSend("My File", finalImage.ToMemoryStream(ImageFormat.Jpeg)));
            }
    
            private static Bitmap RotateImage(Bitmap pointer, object p)
            {
                return pointer;
            }
    
    
        }
    }