使用WebRequest将URL保存为VB.NET中的Image缩略图

时间:2008-12-18 22:17:07

标签: vb.net webrequest

我正在尝试编写一个简单的例程,在其中传递一个URL,然后将webresponse的内容呈现为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

要澄清:是的,我知道我需要更多的代码才能完成我想要做的事情,即渲染/获取网址的屏幕截图(html,图片,所有标记,一切)并将其保存为jpg缩略图。

如果您使用的是谷歌浏览器,那么您已经看到了包含您经常使用的所有网站缩略图的启动页面。这样的事情。

更新:我发现商业付费产品可以完成此任务,例如http://www.websitesscreenshot.com/Index.html,但没有开源实施。

7 个答案:

答案 0 :(得分:3)

仅仅因为Image类具有.FromStream()方法并不意味着任何流是有效图像,并且来自Web服务器的html响应肯定不是有效图像。渲染网页不是一个“简单的例程”。其中有很多内容。

您可以尝试使用WebBrowser控件,因为这可以为您完成大量工作。

答案 1 :(得分:3)

嗯,要么:

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

...可能会添加一些错误处理。 ; - )

答案 2 :(得分:3)

我刚刚找到一个德语code snippet on ActiveVB,可以在网站上创建截图。也许你可以在此基础上建立?不幸的是,代码不仅用德语解释,还用VB6解释。尽管如此,逻辑基本相同,并且不应该很难移植到.NET。希望有所帮助。

答案 3 :(得分:2)

你想做什么?

您是否尝试将网页转换为JPEG?这将需要更多代码,因为您的代码尝试执行的是下载已存在的图像(例如gif,png或甚至另一个jpeg)并将其转换为jpeg。您需要渲染HTML文档,然后您需要捕获渲染文档的图像,然后将其保存为JPEG。

答案 4 :(得分:1)

使用System.Net.WebClient可能更容易,我认为您可以删除除2或3行代码之外的所有代码。即:WebClient.DownloadFile()

MSDN page

答案 5 :(得分:0)

我知道你要求使用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”来解码流。所以它可能对你没有帮助。无论如何,我会把它留在这里。

答案 6 :(得分:0)

或者你可以这样做:

    Dim webclient As New Net.WebClient

    Dim FileName As String = "C:\Share\local.Gif"
    webclient.DownloadFile(URI, FileName)
    PictureBox1.Image = Image.FromFile(FileName)