Программно получите снимок экрана страницы

Я пишу специализированный поисковый робот и синтаксический анализатор для внутреннего пользования, и я требую способности сделать снимок экрана веб-страницы для проверки, какие цвета используются повсюду. Программа примет приблизительно десять веб-адресов и сохранит их как растровое изображение.

Оттуда я планирую использовать LockBits для создания списка пяти наиболее используемых цветов в рамках изображения. К моему знанию это - самый легкий способ использовать цвета в веб-странице, но если существует более легкий способ сделать это, согласитесь со своими предложениями.

Так или иначе я собирался использовать элемент управления ActiveX ACA WebThumb, пока я не видел цену. Я также довольно плохо знаком с C#, только используя его в течение нескольких месяцев. Существует ли решение моей проблемы делания снимка экрана веб-страницы для извлечения цветовой схемы?

48
задан Peter Mortensen 13 April 2013 в 07:03
поделиться

4 ответа

https://screenshotlayer.com/documentation - единственный бесплатный сервис, который я смог найти в последнее время...

Вам нужно будет использовать HttpWebRequest для загрузки бинарного файла изображения. Подробности см. в приведенном выше url.

HttpWebRequest request = HttpWebRequest.Create("https://[url]") as HttpWebRequest;
Bitmap bitmap;
using (Stream stream = request.GetResponse().GetResponseStream())
{
    bitmap = new Bitmap(stream);
}
// now that you have a bitmap, you can do what you need to do...
27
ответ дан 26 November 2019 в 18:43
поделиться
[

] Быстрым и грязным способом будет использование элемента управления WinForms []WebBrowser[] и отрисовка его на растровой карте. Сделать это в автономном консольном приложении немного сложно, так как необходимо знать о последствиях размещения элемента управления []STAThread[] при использовании принципиально асинхронного шаблона программирования. Но вот рабочее доказательство концепции, которое захватывает веб-страницу в BMP файл 800x600:[

] [
namespace WebBrowserScreenshotSample
{
    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Threading;
    using System.Windows.Forms;

    class Program
    {
        [STAThread]
        static void Main()
        {
            int width = 800;
            int height = 600;

            using (WebBrowser browser = new WebBrowser())
            {
                browser.Width = width;
                browser.Height = height;
                browser.ScrollBarsEnabled = true;

                // This will be called when the page finishes loading
                browser.DocumentCompleted += Program.OnDocumentCompleted;

                browser.Navigate("https://stackoverflow.com/");

                // This prevents the application from exiting until
                // Application.Exit is called
                Application.Run();
            }
        }

        static void OnDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // Now that the page is loaded, save it to a bitmap
            WebBrowser browser = (WebBrowser)sender;

            using (Graphics graphics = browser.CreateGraphics())
            using (Bitmap bitmap = new Bitmap(browser.Width, browser.Height, graphics))
            {
                Rectangle bounds = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
                browser.DrawToBitmap(bitmap, bounds);
                bitmap.Save("screenshot.bmp", ImageFormat.Bmp);
            }

            // Instruct the application to exit
            Application.Exit();
        }
    }
}
] [

]Чтобы скомпилировать это, создайте новое консольное приложение и обязательно добавьте ссылки на ассемблеры для []System.Drawing[] и []System.Windows.Forms[].[

] [

][]UPDATE:[] Я переписал код, чтобы избежать необходимости использовать шаблон WaitOne/DoEvents для опросов хакки. Этот код должен быть ближе к следующему лучшему.[

] [

][]UPDATE 2:[] Вы указываете, что хотите использовать его в приложении Windows Forms. В этом случае забудьте о динамическом создании элемента управления []WebBrowser[]. Вы хотите создать скрытый (Visible=false) экземпляр []WebBrowser[] на Вашей форме и использовать его так же, как я показывал выше. Вот еще один пример, который показывает кодовую часть формы с текстовым полем ([]webAddressTextBox[]), кнопкой ([]createScreenshotButton[]) и скрытым браузером ([]webBrowser[]). Пока я работал над этим, Я обнаружил особенность, с которой раньше не сталкивался - событие DocumentCompleteted на самом деле может быть поднято несколько раз в зависимости от характера страницы. Этот пример должен работать в целом, и его можно расширять, чтобы делать все, что угодно:[

] [
namespace WebBrowserScreenshotFormsSample
{
    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Windows.Forms;

    public partial class MainForm : Form
    {
        public MainForm()
        {
            this.InitializeComponent();

            // Register for this event; we'll save the screenshot when it fires
            this.webBrowser.DocumentCompleted += 
                new WebBrowserDocumentCompletedEventHandler(this.OnDocumentCompleted);
        }

        private void OnClickGenerateScreenshot(object sender, EventArgs e)
        {
            // Disable button to prevent multiple concurrent operations
            this.generateScreenshotButton.Enabled = false;

            string webAddressString = this.webAddressTextBox.Text;

            Uri webAddress;
            if (Uri.TryCreate(webAddressString, UriKind.Absolute, out webAddress))
            {
                this.webBrowser.Navigate(webAddress);
            }
            else
            {
                MessageBox.Show(
                    "Please enter a valid URI.",
                    "WebBrowser Screenshot Forms Sample",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation);

                // Re-enable button on error before returning
                this.generateScreenshotButton.Enabled = true;
            }
        }

        private void OnDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // This event can be raised multiple times depending on how much of the
            // document has loaded, if there are multiple frames, etc.
            // We only want the final page result, so we do the following check:
            if (this.webBrowser.ReadyState == WebBrowserReadyState.Complete &&
                e.Url == this.webBrowser.Url)
            {
                // Generate the file name here
                string screenshotFileName = Path.GetFullPath(
                    "screenshot_" + DateTime.Now.Ticks + ".png");

                this.SaveScreenshot(screenshotFileName);
                MessageBox.Show(
                    "Screenshot saved to '" + screenshotFileName + "'.",
                    "WebBrowser Screenshot Forms Sample",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information);

                // Re-enable button before returning
                this.generateScreenshotButton.Enabled = true;
            }
        }

        private void SaveScreenshot(string fileName)
        {
            int width = this.webBrowser.Width;
            int height = this.webBrowser.Height;
            using (Graphics graphics = this.webBrowser.CreateGraphics())
            using (Bitmap bitmap = new Bitmap(width, height, graphics))
            {
                Rectangle bounds = new Rectangle(0, 0, width, height);
                this.webBrowser.DrawToBitmap(bitmap, bounds);
                bitmap.Save(fileName, ImageFormat.Png);
            }
        }
    }
}
]
30
ответ дан 26 November 2019 в 18:43
поделиться

Отметьте это . Кажется, это делает то, что вы хотели, и технически он подходит к проблеме очень похожим образом через управление веб-браузером. Кажется, он обслуживает ряд параметров, которые нужно передать, а также встроенную в него хорошую обработку ошибок. Единственным недостатком является то, что вы создаете внешний процесс (exe), который создает физический файл, который вы прочитаете позже. Судя по вашему описанию, вы даже рассматриваете веб-сервисы, поэтому я не думаю, что это проблема.

Для решения вашего последнего комментария о том, как обрабатывать несколько из них одновременно, это будет идеально.Вы можете запустить, скажем, параллель из 3, 4, 5 или более процессов в любой момент времени или провести анализ цветового бита как потока, пока выполняется другой процесс захвата.

Для обработки изображений я недавно наткнулся на Emgu , сам не использовал, но это кажется увлекательным. Он утверждает, что он быстрый и имеет большую поддержку графического анализа, включая считывание цвета пикселей. Если у меня сейчас есть какой-либо проект по обработке графики, я попробую.

1
ответ дан 26 November 2019 в 18:43
поделиться

вы также можете посмотреть QT jambi http://qt.nokia.com/doc/qtjambi-4.4/html/com/ trolltech / qt / qtjambi-index.html

у них есть хорошая реализация java на основе webkit для браузера, где вы можете сделать снимок экрана, просто выполнив что-то вроде:

    QPixmap pixmap;
    pixmap = QPixmap.grabWidget(browser);

    pixmap.save(writeTo, "png");

Взгляните на примеры - у них есть хороший веб-браузер демо.

1
ответ дан 26 November 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: