2012-02-25 10 views
0

前の質問を参照してくださいmethods width and height MechanizeイメージURLからサイズや重量を取得する方法はありますか?

私はどのように機械化でウェブページの画像からサイズを得ることができますか知っていると思います。

私はヘルパーのような使い方を作成しましたが、プロセスは非常に遅いです。

url = "http://www.birchbox.com" 
page = Mechanize.new.get(url) 
images_url = page.images.map{|img| img.url.to_s }.compact 

これは、ヘルパーメソッドです:

def check_image_size 
    images_urls.each do |image_url| 
    image = MiniMagick::Image.open(image_url) 
    if image[:width] < 100 
    images_urls.delete("#{image_url}") 
    end 
    end 
return images_urls 
end 

彼らは100pxにの小さい幅を持っている場合、このメソッドは、配列からのすべての画像を削除します。

この方法の問題は、処理が非常に遅いことです。この方法では、ページのロードに時間がかかりすぎます。

Mechanizeでこれを行う簡単な方法はありますか?

+0

<100の場合は、イメージの実際のサイズ、または表示した場合に誰かに表示される方法を意味しますか ページ。彼らは同じではありません。 – smparkes

+0

私はイメージの実際のサイズを参照してください:D – hyperrjas

答えて

1

イメージの実際のサイズが必要な場合は、イメージをフェッチする必要があります。

ご了承のとおり、時間がかかる場合があります。これを早めるための1つの方法は、全体のイメージを取得せず、代わりにそれを徐々に取得し、解析することです。画像のサイズがわかるとすぐに画像の読み込みをやめることができます。

これは非常に複雑で、画像の種類によっては画像を完全に取得してサイズを知る必要があるためです(私は思っています)。

+0

私の主な問題は、その機械化は、ピクセルサイズ** 1x1 **のイメージを取得するか、アイコンとして画像を表示したくないアバターなどです。私はこの画像をフィルタリングする必要があります。例えば。 ** spacer.gif **古いWebページをレイアウトするためのスペース。次に、この画像タイプをどのようにフィルタリングできるかを知りたいのですが... – hyperrjas

+0

あなたが求めているものは簡単には答えられません。あなたは実際の画像サイズを望んでいなくても、大きな画像を小さく表示したり、逆に表示することができます。そのためには、CSS(JavaScriptなど)を解釈する必要があります。ヘッドレスブラウザで行うことができます(Webkitに基づいているブラウザがいくつかあります)。しかし、私が言ったように、それはすべて自明ではありません。 – smparkes

1

私はsmparkesに同意します、それはおそらくあなたにスピードの利点を与えることはないほど複雑です。しかし、ここに物事をスピードアップするためのいくつかのアイデアがあります:

  • ファイルサイズを確認してください。最初に一時ファイルに画像をダウンロードすると、 は1Kb程度のものをスキップすることができます。
  • ファイル名を分析します。あなたはspacer.gifをスキップすることを知っていますが、どのように名前が my_tiny_image_20x20.gif
  • のように同時にダウンロードしてください。それは扱いにくいですが、イベントマシンを使って に同時に画像をダウンロードすることができます。
  • キャッシュを実装します。一度画像の幅を指定すると、 dbに保存されるので、次回に見ることができます。
+0

ありがとう、私はこの問題の修正があると思います。ソリューションを開発するときは、私はそれを投稿します:D – hyperrjas

1

Fast Image

FastImageが

そして...

、必要に応じて として少しをフェッチすることによって、そのURIを指定した画像のサイズや種類を見つけるを見てみましょう
images.each do |src| 
     size = FastImage.size(src) 
     puts "width: #{size[0]}" 
     puts "height: #{size[1]}" 
    end 
end 
関連する問題