Использование WebRequest для сохранения URL как эскиза изображения в VB.NET - PullRequest
1 голос
/ 19 декабря 2008

Я пытаюсь написать простую подпрограмму, в которой я передаю ему URL, и он отправляет и отображает содержимое веб-ответа в виде jpg. Я нашел решение где-то в C # и портировал его на vb.net, однако, когда я запускаю его, он выбрасывает аргумент аргумента «параметр недопустим» при попытке создать экземпляр изображения. Может кто-нибудь взглянуть на следующий код и дать мне знать, если я на правильном пути?

Sub SaveUrl(ByVal aUrl As String)
    Dim response As WebResponse
    Dim remoteStream As Stream
    Dim readStream As StreamReader
    Dim request As WebRequest = WebRequest.Create(aUrl)
    response = request.GetResponse
    remoteStream = response.GetResponseStream
    readStream = New StreamReader(remoteStream)
    Dim img As System.Drawing.Image = System.Drawing.Image.FromStream(remoteStream)
    img.Save(aUrl & ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
    response.Close()
    remoteStream.Close()
    readStream.Close()
End Sub

Для уточнения: Да, я знаю, что мне нужно МНОГО дополнительного кода, чтобы выполнить то, что я хочу сделать, то есть сделать / сделать снимок экрана с URL (html, изображения, вся разметка) , все) и сохранить его в виде эскиза JPG.

Если вы использовали Google Chrome, вы увидели стартовую страницу с миниатюрами всех сайтов, которые вы часто используете. Нечто подобное.

Обновление: Хорошо. Я нашел коммерческие платные продукты для этого, такие как http://www.websitesscreenshot.com/Index.html, но без реализации с открытым исходным кодом.

Ответы [ 7 ]

3 голосов
/ 19 декабря 2008

Я только что нашел немецкий код кода на ActiveVB , который создает скриншот с веб-сайта. Возможно, вы можете основываться на этом? К сожалению, код не только объясняется на немецком языке, но и в VB6. Тем не менее, логика по сути та же самая, и ее не должно быть сложно портировать на .NET. Надеюсь, это поможет.

3 голосов
/ 19 декабря 2008

Ну, либо:

My.Computer.Network.DownloadFile("http://example.com/file.jpeg", "local.jpeg")

Или, чтобы создать миниатюру:

Using wc As New Net.WebClient()
    Dim img = Image.FromStream(wc.OpenRead("http://example.com/file"))
    img.GetThumbnailImage(32, 32, Function() False, Nothing).Save("c:\local.jpg")
End Using

… возможно, добавим обработку ошибок. ; -)

3 голосов
/ 19 декабря 2008

Тот факт, что класс Image имеет метод .FromStream(), не означает, что любой поток является допустимым изображением, и ответ html от веб-сервера, безусловно, не будет действительным изображением. Рендеринг веб-страницы не является простой процедурой. В это многое входит.

Вы можете попробовать использовать элемент управления WebBrowser, так как он может сделать большую работу за вас.

2 голосов
/ 19 декабря 2008

Что вы пытаетесь сделать?

Вы пытаетесь конвертировать веб-страницу в JPEG? Для этого потребуется немного больше кода, поскольку ваш код пытается загрузить уже существующее изображение (например, gif, png или даже другой jpeg) и преобразовать его в jpeg. Вам нужно будет что-то сделать для рендеринга HTML-документа, затем вам нужно будет захватить изображение отрендеренного документа, а затем сохранить его как JPEG.

1 голос
/ 19 декабря 2008

Возможно, проще использовать System.Net.WebClient, я думаю, что вы можете удалить все, кроме 2 или 3 строк кода. т.е.: WebClient.DownloadFile()

Страница MSDN

0 голосов
/ 08 сентября 2011

Или вы можете просто сделать это:

    Dim webclient As New Net.WebClient

    Dim FileName As String = "C:\Share\local.Gif"
    webclient.DownloadFile(URI, FileName)
    PictureBox1.Image = Image.FromFile(FileName)
0 голосов
/ 19 декабря 2008

Я знаю, что вы запрашиваете VB, но вот код C #, который я использую в своем проекте для захвата локальных миниатюр из URL-адресов изображений (асинхронно) Я попытался удалить все специфичные для проекта вещи, чтобы иметь смысл в качестве отдельного примера.

var wc = new WebClient();
wc.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
wc.DownloadDataCompleted += wc_DownloadDataCompleted;

wc.DownloadDataAsync(imageProvider.Image, "yourFilenameHere");

А вот обработчик события wc_DownloadDataCompleted:

private void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    if (e.Error == null && !e.Cancelled)
    {
        var filename = e.UserState.ToString();

        using (var ms = new MemoryStream(e.Result))
        {
            var bi = new BitmapImage();
            bi.BeginInit();
            bi.StreamSource = ms;
            bi.DecodePixelWidth = 80; // _maxThumbnailWidth;
            bi.EndInit();

            var encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bi));
            var filename = Path.Combine(_thumbFolder, filename);
            try
            {
                using (var fs = new FileStream(filename, FileMode.Create))
                {
                    encoder.Save(fs);
                }
            }
            catch { }
        }
    }
}

Редактировать

Полагаю, мне следует добавить, что это было в приложении WPF - отсюда использование «BitmapImage» и «BitmapFrame» для декодирования потока. Так что это может вам не помочь. Я все равно оставлю это здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...