1

我正在尝试编写一个简单的例程,在其中将 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

澄清: 是的,我知道我需要更多代码来完成我想做的事情,即渲染/截取 URL(html、图像、所有标记、所有内容)并将其保存为 jpg缩略图。

如果您使用过 Google Chrome,您会看到包含您经常使用的所有网站的缩略图的启动页面。类似的东西。

更新: 好的,我找到了商业付费产品来实现这一点,比如http://www.websitesscreenshot.com/Index.html但没有开源实现。

4

7 回答 7

3

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

您可以尝试使用 WebBrowser 控件,因为它可以为您完成很多工作。

于 2008-12-18T22:23:08.167 回答
3

我刚刚在 ActiveVB 上找到了一个德语代码片段,它创建了一个网站的屏幕截图。也许您可以在此基础上再接再厉?不幸的是,代码不仅用德语解释,而且用 VB6 解释。尽管如此,逻辑本质上是相同的,移植到 .NET 应该不难。希望有帮助。

于 2008-12-19T17:48:20.837 回答
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

…也许添加一些错误处理。;-)

于 2008-12-18T23:03:35.493 回答
2

你想做什么?

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

于 2008-12-18T22:23:06.963 回答
1

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

MSDN 页面

于 2008-12-18T22:24:39.147 回答
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”来解码流。所以它可能对你没有帮助。反正我要把它留在这里。

于 2008-12-18T22:43:18.857 回答
0

或者你可以这样做:

    Dim webclient As New Net.WebClient

    Dim FileName As String = "C:\Share\local.Gif"
    webclient.DownloadFile(URI, FileName)
    PictureBox1.Image = Image.FromFile(FileName)
于 2011-09-08T12:17:46.523 回答