1

URLを渡して、Web応答のコンテンツを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応答は確かに有効な画像ではありません。Webページのレンダリングは、「単純なルーチン」ではありません。それに入ることがたくさんあります。

WebBrowserコントロールを使用してみると、多くの作業が可能になります。

于 2008-12-18T22:23:08.167 に答える
3

Web サイトからスクリーンショットを作成するドイツ語のコード スニペットを 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

あなたは何をしようとしているのですか?

WebページをJPEGに変換しようとしていますか?コードが実行しようとしているのは、既存の画像(gif、png、さらには別のjpegなど)をダウンロードしてjpegに変換することであるため、これにはもう少しコードが必要になります。HTMLドキュメントをレンダリングするものが必要になります。次に、レンダリングされたドキュメントの画像をキャプチャして、それをJPEGとして保存する必要があります。

于 2008-12-18T22:23:06.963 に答える
1

おそらく使いやすいでしょうSystem.Net.WebClient。2行または3行を除くすべてのコードを削除できると思います。すなわち:WebClient.DownloadFile()

MSDNページ

于 2008-12-18T22:24:39.147 に答える
0

VB を求めていることは承知していますが、私のプロジェクトで画像 URL からローカル サムネイルを (非同期で) キャプチャするために使用する C# コードを次に示します。プロジェクト固有のものをすべて取り除こうとしたので、スタンドアロンの例として理にかなっています。

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 に答える