来自网页的图片不会停止加载

时间:2017-12-14 17:31:19

标签: c#

我希望从一个从IP摄像头流式传输的网页截取屏幕截图,因此不会triggerWebBrowserReadyState.Complete

有问题的网页实际上是流式传输mjpeg,浏览器总是加载/流式传输。

我可以为其他网址生成图片,但无法猜测这是否包含“导航已取消'。

我试过WebBrowser.Stop(),但无济于事......

网页只是一个mJpeg:

<img class"shrink" src="192.168.1.124/Streaming/channels/1/httpPreview"; alt="192.168.1.124/Streaming/channels/1/httpPreview"; class="shrinkToFit" height="148" width="217"> </img>
using Telegram.Bot;
using System.Threading.Tasks;
using System.IO;
using Telegram.Bot.Types;
using System.Threading;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Imaging;

namespace Telegram_Alerter
{
    public static class BitmapExtensions
    {
        public static void SaveJPG100(this Bitmap bmp, string filename)
        {
            var encoderParameters = new EncoderParameters(1);
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
            bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters);
        }

        public static void SaveJPG100(this Bitmap bmp, Stream stream)
        {
            var encoderParameters = new EncoderParameters(1);
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
            bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters);
        }

        public static ImageCodecInfo GetEncoder(ImageFormat format)
        {
            var codecs = ImageCodecInfo.GetImageDecoders();

            foreach (var codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                {
                    return codec;
                }
            }

            // Return 
            return null;
        }
    }

    class Program
    {
        static public void Main(string[] args)
        {
            TelegramMessageAsync().Wait();
        }

        static public async Task TelegramMessageAsync()
        {
            TelegramBotClient Bot = new TelegramBotClient("<mykey>");
            WebsiteToImage websiteToImage = new WebsiteToImage("http://192.168.1.124/Streaming/channels/1/httpPreview", Application.StartupPath + "file.jpg");
            websiteToImage.Generate();
            using (FileStream fs = System.IO.File.OpenRead(Application.StartupPath + "file.jpg"))
            {
                FileToSend fts = new FileToSend();
                fts.Content = fs;
                fts.Filename = "file.jpg";
                await Bot.SendPhotoAsync(<bot>, fts, "message here");
            }
        }

        public class WebsiteToImage
        {
            private Bitmap m_Bitmap;
            private string m_Url;
            private string m_FileName = string.Empty;

            public WebsiteToImage(string url)
            {
                // Without file 
                m_Url = url;
            }

            public WebsiteToImage(string url, string fileName)
            {
                // With file 
                m_Url = url;
                m_FileName = fileName;
            }

            public Bitmap Generate()
            {
                // Thread 
                var m_thread = new Thread(_Generate);
                m_thread.SetApartmentState(ApartmentState.STA);
                m_thread.Start();
                m_thread.Join();
                return m_Bitmap;
            }

            private void _Generate()
            {
                var browser = new WebBrowser { ScrollBarsEnabled = false };
                browser.Navigate(m_Url);
                browser.DocumentCompleted += WebBrowser_DocumentCompleted;
                while (browser.ReadyState != WebBrowserReadyState.Complete)
                {

                    Application.DoEvents();
                }

                browser.Dispose();
            }

            private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                // Capture 
                var browser = (WebBrowser)sender;
                browser.ClientSize = new Size(1024,768);
                browser.ScrollBarsEnabled = false;
                m_Bitmap = new Bitmap(1024,768);
                browser.BringToFront();
                browser.DrawToBitmap(m_Bitmap, browser.Bounds);

                // Save as file? 
                if (m_FileName.Length > 0)
                {
                    // Save 
                    m_Bitmap.SaveJPG100(m_FileName);
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

也许该页面包含永不加载的iframe。如果是:

 private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
  // to check if it is not Iframe
if (e.Url.AbsolutePath != this.webBrowser.Url.AbsolutePath)
                            {
                                // Capture 
                                var browser = (WebBrowser)sender;
                                browser.ClientSize = new Size(1024,768);
                                browser.ScrollBarsEnabled = false;
                                m_Bitmap = new Bitmap(1024,768);
                                browser.BringToFront();
                                browser.DrawToBitmap(m_Bitmap, browser.Bounds);

                                // Save as file? 
                                if (m_FileName.Length > 0)
                                {
                                    // Save 
                                    m_Bitmap.SaveJPG100(m_FileName);
                                }
                            }
                 }

答案 1 :(得分:0)

感谢您的努力,但我通过使用名为N.Reco的FFMpeg .NET包装器回答了这个问题,这意味着我不必担心解析MJPEG以获得单个帧然后转换为JPEG。

这是通过两行代码实现的,但FFMPEG确实为您的应用程序添加了20Mb。

        var ffmpeg = new NReco.VideoConverter.FFMpegConverter();
        ffmpeg.GetVideoThumbnail(pathToVideoFile, Application.StartupPath + stamp);