DOBON.NET DOBON.NETプログラミング掲示板過去ログ

background-image を取得する方法

環境/言語:[win7,.NET,Framework3.5,VB2008]
分類:[.NET]

webbrowserに表示される画像を取得したいと思っています。

imgタグで指定されたものは、こちらのような方法で簡単とれます。
http://www.atmarkit.co.jp/fdotnet/dotnettips/687nondispbrowser/nondispbrowser.html

スタイルシートなどで指定された画像はスタイルシートを解析して処理するしかないのかな?と思っています。

imgタグの調査のような方法で調べる方法はあるでしょうか。
ネットワーク通信を監視して、jpg,gifなどの拡張子を拾うという方法はできないかとことも考えています。ただ仕組み的に可能なのかもわかりません。

アドバイスよろしくお願いします。
■No28223に返信(muuuuuuさんの記事)
> スタイルシートなどで指定された画像はスタイルシートを解析して処理するしかないのかな?と思っています。
実行時に、スクリプトで割り当てられる場合もありますよ。


> 調べる方法はあるでしょうか。
処理対象の HtmlElement クラスから、DomElement プロパティで
アンマネージの DOM を得て、その currenStyle プロパティを得てください。
http://msdn.microsoft.com/en-us/library/ms535231.aspx

そこで得たオブジェクトの backgroundImage プロパティを得れば
取得できるかと思います。多分。
魔界の仮面弁士さん、いつもありがとうございます。

まだちょっと調べ切れていませんが、currentStyleについて調べてみます。
時間がかかると思いますが、テスト結果をご報告いたします。
■No28228に返信(muuuuuuさんの記事)
> まだちょっと調べ切れていませんが、currentStyleについて調べてみます。
> 時間がかかると思いますが、テスト結果をご報告いたします。

とりあえずサンプル。
画面に Timer を貼り、Load イベントで tiemr1.Start(); しておいてください。

// 参照設定に COMの「Microsoft HMTL Object Library」を含める必要があります。
private void timer1_Tick(object sender, EventArgs e)
{
    HtmlDocument doc = webBrowser1.Document;
    if (doc == null) return;

    // マウスカーソル位置にあるタグを取得
    Point pos = webBrowser1.PointToClient(Cursor.Position);
    HtmlElement tag = doc.GetElementFromPoint(pos);
    
    // background-image スタイルを取得
    if(tag == null)
    {
        label1.Text = "(範囲外)";
        label2.Text = "";
    }
    else
    {
        label1.Text = tag.TagName;

        mshtml.IHTMLElement2 elment = (mshtml.IHTMLElement2)tag.DomElement;
        mshtml.IHTMLCurrentStyle style = (mshtml.IHTMLCurrentStyle)elment.currentStyle;

        label2.Text = style.backgroundImage;

        System.Runtime.InteropServices.Marshal.ReleaseComObject(style);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(elment);
    }
}
魔界の仮面弁士さん、ありがとうございます。

サンプル試してみました。
これはすごく面白いです。

なんだか背景画像のURLがみられるのが不思議な感じです。

mshtml.IHTMLCurrentStyleの扱いがもう一つわからないのですが、
マウスのポイントでポジションを経由せずに、Documentから取り出す方法はあるでしょうか?

よろしくお願いします。
2011/02/24(Thu) 09:23:50 編集(投稿者)

こんな感じでやってみたら、取得できました!

foreach (HtmlElement htmlc in webBrowser1.Document.All)
{
mshtml.IHTMLElement2 elm = (mshtml.IHTMLElement2)htmlc.DomElement;
if (elm.currentStyle.backgroundImage != "none")
{
String imgurl = Regex.Match(elm.currentStyle.backgroundImage,@"^url\((.*?)\)$",RegexOptions.IgnoreCase).Groups[1].ToString();
imgurl = imgurl.Trim('"').Trim('\'');
if (ListSrc.IndexOf(imgurl) < 0) ListSrc.Add(imgurl);
}
}

いろいろと教えていただいてありがとうございます。
感謝です。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板