0

可能であればデコードした後、XPCOM を介して Web ページ上のすべての画像を取得するにはどうすればよいですか?

画像は、一部の CSS プロパティ、img タグ内、または Web 開発者が含めた任意のフォームで背景 URL として HTML で指定される場合があります。

imgIContainer、imgIDecodeObserver、および他の多くのインターフェースを調べてみました。画像の URI を Mozilla に提供して、画像をロードし、デコードして imgIContainer を返す方法はありますが。しかし、現在の Web ページですべての画像を取得する方法が見つかりませんでした。

これは、Java または Javascript で行う必要があります。

助言がありますか?


@Wladimir - ご協力ありがとうございます。

CSS コンストラクト (背景画像) を含むすべての画像が必要です。これで、nsIWebProgressListener からのイベントをリッスンしています。


    onStateChange: function(webProgress, request, stateFlags, status) {
        if ((~stateFlags & (nsIWebProgressListener.STATE_IS_REQUEST | nsIWebProgressListener.STATE_STOP)) == 0) {
            var imgReq = request.QueryInterface(CI.imgIRequest);
            if (imgReq)
                var img = imgReq.image;
        }
    }

問題は、request.QueryInterface(CI.imgIRequest)すべての非画像リクエストに対して例外をスローすることです。これらの例外は、コードを try-catch ブロック内に配置することで無視できますが、私は物事をきれいに行うことを好みます。

リクエストが画像かどうかを確認できる条件はありますか?

4

1 に答える 1

0

あなたが見ることができる既存のコードがあります。[ページ情報]ダイアログには、ページ上のほとんどの画像を正常に表示する[メディア]タブがあります。重要な関数はgrabAll()pageInfo.jsあり、要素ごとに呼び出されます(TreeWalkerを介して)。ご覧のとおり、画像を取得する一般的な方法はありません。この関数は、この要素の一連のCSSプロパティの値を抽出するために使用しwindow.getComputedStyle()ます:background-image、、、。また、、、(ファビコン)、、、およびタグも検索します。ただし、すべてを認識できるわけではありません。たとえば、これらのCSS構造は認識されません。border-imagelist-style-imagecursor<img><svg:image><link><input><button><object><embed>

.foo:before
{
  content: url(image.png);
}
.foo:hover
{
  background-image: url(image.png);
}

それでも、ロード時にWebページからのリクエストを確認したい場合を除いて、これはおそらく可能な限りのことです。

編集:( Webプログレスリスナーを介して)実行されたリクエストを確認すると、次のことができます。

if (request instanceof CI.imgIRequest)
  var img = request.URI.spec;

request.imageあまり役に立たないことに注意してください。ほとんどすべてのメソッドはimgIContainer、ネイティブコードからのみアクセスできます。

于 2012-05-09T19:39:35.200 に答える