如何调整外部图像的大小并即时提供服务?

时间:2013-01-11 21:16:12

标签: ruby image sinatra

我有一个sinatra应用程序,它从API获取图像URL,我想缩放它们然后提供它们而不将它们存储在服务器上。我见过的大多数宝石只获得本地图像,然后处理队列中的每一个。我只需要缩放五个图像并在页面上显示它们。有没有快速的方法来做到这一点?

更多澄清:

我需要一种方法来从外部获取图像(例如notmysite.com/img.jpg)以及用于在页面上提供缩放图像的代码。我不能用css或其他前端方法来做这件事,因为这个页面将由一个脚本呈现,该脚本会扭曲前端缩放的图像。

2 个答案:

答案 0 :(得分:3)

Dragonfly使用imagemagick来缩放图像。这里有一些代码我已经用MiniMagick之前的东西拼凑起来了,所以它会非常相似。

将自己的文件转换为Tempfile。我已经使用FaradayTypheous完成了此操作。然后使用magick进行缩放!

require 'faraday'
require 'faraday_middleware'
#require 'faraday/adapter/typhoeus' # see https://github.com/typhoeus/typhoeus/issues/226#issuecomment-9919517 if you get a problem with the requiring
require 'typhoeus/adapters/faraday'

configure do
  Faraday.default_connection = Faraday::Connection.new( 
    :headers => { :accept =>  'image/*',
    :user_agent => "Sinatra via Faraday"}
  ) do |conn|
    conn.use Faraday::Adapter::Typhoeus
  end
end

helpers do
  def grab_image_and_scale
    response = Faraday.get url # you'll need to supply this variable somehow, your choice
    filename = "SOMETHING.jpg"
    tempfile = Tempfile.open(filename, 'wb') { |fp| fp.write(response.body) }

    thumb = MiniMagick::Image.open( tempfile.path )
    thumb.thumbnail( "75x75" )
    thumb.write( File.join settings.public, "images", "thumb_#{filename}") 

    scaled = MiniMagick::Image.open( secure_path )
    scaled.resize( "600" )
    scaled.write( File.join settings.public, "images", "scaled_#{filename}")
  end
end

我将留给你研究如何将公共图像文件夹的路径更改为临时文件(如果你分享它是如何完成的话,那就太好了)。

答案 1 :(得分:0)

与Ruby或sinatra无关的一种方法是将widthheight属性添加到img HTML标记。你最终会得到这样的东西:

<img src="img.source.from.API.JPG" width="2000px" height="100px" />

修改

另一种方法是使用javascript更改维度,如下所示:https://stackoverflow.com/a/11333825/693597。您可以考虑编写JS文件并将其包含在HTML的标题中。