如何从图像网址获取大小或重量?

时间:2012-02-25 20:27:20

标签: ruby-on-rails ruby screen-scraping mechanize

参考上一个问题methods width and height Mechanize

我想知道如何通过Mechanize从网页图片获取大小。

我已经创建了一个像helper一样使用的方法,但是这个过程很慢,例如。

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有什么快速简便的方法吗?

3 个答案:

答案 0 :(得分:1)

如果你想要图像的实际尺寸,你将不得不去取它。

正如您所说,这可能需要很长时间。加快这种情况的一种方法是不获取整个图像,而是逐步获取它并在它到来时解析它。只要有足够的图像来确定图像大小,就可以停止阅读图像。

这相当复杂,可能不会一直有效,因为对于某些图像类型,您需要完全获取图像才能知道尺寸(我认为)。

答案 1 :(得分:1)

我同意smparkes,它很复杂,它可能不会给你速度优势。但是这里有一些想法可以加快速度:

  • 检查文件大小。首先将图像下载到临时文件中 将能够跳过小于1Kb的任何东西。
  • 分析文件名。你知道跳过spacer.gif但名字怎么样 比如my_tiny_image_20x20.gif
  • 同时下载。这很棘手,但你可以使用eventmachine 同时下载图像。
  • 实施缓存。确定图像的宽度后,将其保存 一个数据库,所以你可以在下次查找它。

答案 2 :(得分:1)

查看Fast Image

  

FastImage通过提取来查找给定其uri的图像的大小或类型   尽可能少

然后......

images.each do |src|
         size = FastImage.size(src)
         puts "width: #{size[0]}"
         puts "height: #{size[1]}"
     end
end