我正在尝试编写一个简单的例程,在其中传递一个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,但没有开源实施。
答案 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()
答案 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)