C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: WebBrowserクラスで表示した画像の取得


(過去ログ 74 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■43407 / inTopicNo.1)  WebBrowserクラスで表示した画像の取得
  
□投稿者/ なっと (6回)-(2009/11/10(Tue) 10:33:33)

分類:[C++/CLI] 

こんにちわ。

WebBrowser クラスで表示したページの画像(jpg png など)を PictureBoxで別に表示したいのですが、
イメージの取得方法がわかりません。 webBrowser1->Document->Images[] あたりから取れそうかなと
思い、色々ためしてみましたが、PictureBoxのImageにロードできそうなものが見つかりませんでした。
最終的には、表示されたイメージをすべて保存したいと考えております。
ヒント、もしくは方法をご存知でしたら、ご教授下さい。
よろしくお願いいたします。

引用返信 編集キー/
■43410 / inTopicNo.2)  Re[1]: WebBrowserクラスで表示した画像の取得
□投稿者/ Hongliang (504回)-(2009/11/10(Tue) 11:18:08)
プロパティ一つで取れるってものではありません。
方法としては、キャッシュからコピーするか、それとも別口でダウンロードするかの二通りがあります。
まず、画像の URL は、Document->Images で列挙した img 要素から GetAttribute メソッドで src 属性値を取得すれば手に入れることができます。
// この src プロパティが常に絶対パスを返すかどうかは知りません。
Win32API の GetUrlCacheEntry などを使えば、引数に渡した URL のキャッシュの情報を取得できます。もしキャッシュファイルが存在しているならそのパスも取得できるので、そこからファイルコピーすればいいでしょう。
キャッシュファイルが存在しないのなら、WebClient クラスなどを使って直接ダウンロードすることになります。認証などがあるといささか面倒ですが。
引用返信 編集キー/
■43416 / inTopicNo.3)  Re[2]: WebBrowserクラスで表示した画像の取得
□投稿者/ 渋木宏明(ひどり) (1244回)-(2009/11/10(Tue) 12:22:26)
渋木宏明(ひどり) さんの Web サイト
> キャッシュファイルが存在しないのなら、WebClient クラスなどを使って直接ダウンロードすることになります。認証などがあるといささか面倒ですが。

また、画像が動的に生成されたものである場合、必ずしも WebBrwser コントロールに表示されているのと同じ画像が取得できる保証はありません。
引用返信 編集キー/
■43421 / inTopicNo.4)  Re[3]: WebBrowserクラスで表示した画像の取得
□投稿者/ なっと (7回)-(2009/11/10(Tue) 13:11:43)
なるほど…簡単に取れるものではないのですね。

WebClientでダウンロードした Htmlを解析して、イメージを取得するプログラムは作成したのですが、
クッキーではじかれてしまい、WebBrowser経由で取れるかな?と思ったのですが…。

キャッシュにファイルは残るようでしたので、そこからコピーしてみます。

ありがとうございました。


解決済み
引用返信 編集キー/
■43426 / inTopicNo.5)  Re[4]: WebBrowserクラスで表示した画像の取得
□投稿者/ オショウ (382回)-(2009/11/10(Tue) 14:27:34)
2009/11/10(Tue) 14:30:38 編集(投稿者)
No43421 (なっと さん) に返信
> なるほど…簡単に取れるものではないのですね。
> 
> WebClientでダウンロードした Htmlを解析して、イメージを取得するプログラムは作成したのですが、
> クッキーではじかれてしまい、WebBrowser経由で取れるかな?と思ったのですが…。

  試しにやってみたら、取れたので参考まで・・・
  ただし、C++ CLIではありませんので!(あしからず)

    Private Sub SaveImage(ByVal wb As WebBrowser, ByVal SavePath As String)

        With wb.Document
            If .Images.Count > 0 Then
                For i As Integer = 0 To .Images.Count - 1
                    Dim hec As HtmlElement
                    Dim ic As mshtml.HTMLImg
                    Dim imageName As String

                    hec = .Images.Item(i)
                    ic = CType(hec.DomElement, mshtml.HTMLImg)

                    If ic.nameProp <> String.Empty Then
                        imageName = SavePath + "\" + ic.nameProp
                        Using wc As New System.Net.WebClient()
                            wc.DownloadFile(ic.href, imageName)
                        End Using
                    Else
                        Dim ici As System.Drawing.Imaging.ImageCodecInfo
                        Dim webreq As System.Net.HttpWebRequest
                        Dim webres As System.Net.HttpWebResponse

                        ici = GetEncoderInfo("image/" + ic.mimeType.ToLower)
                        imageName = SavePath + "\" + ic.alt + System.IO.Path.GetExtension(ici.FilenameExtension.Split(";"c)(0)).ToLower()

                        webreq = CType(System.Net.WebRequest.Create(ic.href), System.Net.HttpWebRequest)
                        webres = CType(webreq.GetResponse(), System.Net.HttpWebResponse)

                        Using strm As System.IO.Stream = webres.GetResponseStream()
                            Using fs As New System.IO.FileStream(imageName, System.IO.FileMode.Create, System.IO.FileAccess.Write)
                                Dim b As Integer

                                While True
                                    b = strm.ReadByte()
                                    If b = -1 Then Exit While
                                    fs.WriteByte(Convert.ToByte(b))
                                End While

                                fs.Close()
                            End Using

                            strm.Close()
                        End Using
                    End If
                Next

            End If
        End With
    End Sub

    Private Function GetEncoderInfo(ByVal mineType As String) As System.Drawing.Imaging.ImageCodecInfo

        mineType = mineType.Replace("compuserve ", "")

        Dim encs() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
        Dim enc As System.Drawing.Imaging.ImageCodecInfo

        For Each enc In encs
            If mineType.IndexOf(enc.MimeType) > -1 Then
                Return enc
            End If
        Next

        Return Nothing

    End Function

● 呼び出し方は・・・

  SaveImage(WebBrowser1, Application.StartupPath)

  としてみました。

※ ちょっと無理やりのところがありますが、エラーしたら若干の追加修正で
  可能かと思います。

以上。参考まで

解決済み
引用返信 編集キー/
■43436 / inTopicNo.6)  Re[5]: WebBrowserクラスで表示した画像の取得
□投稿者/ なっと (8回)-(2009/11/10(Tue) 15:46:01)
>>オショウさん

うわあ…参考というか解ですね!
キャッシュあさり完成してから見たので少しショックだったり(笑

乗せ変えたいと思います!ありがとうございました!

解決済み
引用返信 編集キー/
■43439 / inTopicNo.7)  Re[6]: WebBrowserクラスで表示した画像の取得
□投稿者/ Hongliang (505回)-(2009/11/10(Tue) 15:57:52)
必ずダウンロードし直しというのは、処理が重くなるし相手サーバにも優しくありません。渋木さんがおっしゃったように必ず同じものが取れるという保証もありませんし。
まずキャッシュを確認し、存在しないときに改めてダウンロードする、という二段構えをお勧めします。
引用返信 編集キー/
■43528 / inTopicNo.8)  Re[7]: WebBrowserクラスで表示した画像の取得
□投稿者/ なっと (9回)-(2009/11/12(Thu) 09:45:38)
>>オショウさん

試してみましたが、残念ながらクッキーで弾かれてしまいました。

その辺の動作の理解が浅いので、なぜこうなるのかはわかりませんが、
勉強してみたいと思います。ありがとうございました。



>>Hongliangさん

ごもっともです。
ついでにお聞きしたいのですが、Win32ApiをC++CLIで呼ぶ場合に、
GetUrlCacheEntryInfo関数などは INTERNET_CACHE_ENTRY_INFO という構造体が必要になりますが、
C++CLIでは当然宣言されていません。
このような場合、C++CLI用に構造体を作って回避しているのでしょうか?

解決済み
引用返信 編集キー/
■43529 / inTopicNo.9)  Re[8]: WebBrowserクラスで表示した画像の取得
□投稿者/ Hongliang (508回)-(2009/11/12(Thu) 10:17:04)
> ついでにお聞きしたいのですが、Win32ApiをC++CLIで呼ぶ場合に、
> GetUrlCacheEntryInfo関数などは INTERNET_CACHE_ENTRY_INFO という構造体が必要になりますが、
> C++CLIでは当然宣言されていません。
> このような場合、C++CLI用に構造体を作って回避しているのでしょうか?


普通に wininet.h を #include するだけですけど。
GetUrlCacheEntryInfo にも必要ですよね、このヘッダファイル。
引用返信 編集キー/
■43530 / inTopicNo.10)  Re[8]: WebBrowserクラスで表示した画像の取得
□投稿者/ オショウ (391回)-(2009/11/12(Thu) 10:19:07)
No43528 (なっと さん) に返信
> 試してみましたが、残念ながらクッキーで弾かれてしまいました。

  いまいち、理解しがたいのですが・・・

  http://dobon.net/vb/dotnet/internet/usecookie.html

  こういう手法もありますので、できるんでは?

※ もし仮にどこか一般インターネットサイトで、上記の動作が
  確認できるURLがあるなら、お知らせ下さい。テストしてみ
  ますが・・・

以上。参考まで
解決済み
引用返信 編集キー/
■43539 / inTopicNo.11)  Re[9]: WebBrowserクラスで表示した画像の取得
□投稿者/ なっと (10回)-(2009/11/12(Thu) 12:04:26)
>普通に wininet.h を #include するだけですけど。
>GetUrlCacheEntryInfo にも必要ですよね、このヘッダファイル。

未熟者ですいません…。
普通に include すると、エラー大量発生します。
なので、C++CLI用に作成するのかな?と思った次第です。

引用返信 編集キー/
■43554 / inTopicNo.12)  Re[10]: WebBrowserクラスで表示した画像の取得
□投稿者/ なっと (12回)-(2009/11/12(Thu) 14:17:11)
<wininet.h> の前に <windows.h>をインクルードしたら普通にできました。
恥ずかしい…。
ありがとうございました!

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -