【问题标题】:How can I resize external images and serve them on-the-fly?如何调整外部图像的大小并即时提供它们?
【发布时间】:2013-01-12 23:06:04
【问题描述】:

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

更多说明:

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

【问题讨论】:

  • 更多信息将有助于回答这个问题。
  • @iain 我需要一种从外部获取图像的方法(例如notmysite.com/img.jpg),并让代码在页面上提供缩放图像。我不能用 css 做到这一点,因为这个页面将由一个脚本渲染,该脚本会扭曲用 css 缩放的图像
  • 您是否有一个示例说明其中一个可以为本地文件执行此操作的 gem?
  • @iain 类似dragonfly
  • 你找到答案了吗?

标签: ruby image sinatra


【解决方案1】:

Dragonfly 使用 imagemagick 来缩放图像。这是我从以前用MiniMagick 完成的东西中拼凑出来的一些代码,所以它会非常相似。

将文件放入Tempfile。我在这里使用FaradayTypheous 完成了这项工作。然后使用魔法对其进行缩放!

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

我会留给你解决如何将公共图像文件夹的路径更改为临时文件(如果你分享它是如何完成的会很好:)

【讨论】:

    【解决方案2】:

    一种与 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 的标头中。

    【讨论】:

    • 不幸的是,我不能这样做,因为页面是由一个脚本渲染的,当它们像这样调整大小时会破坏图像。它必须以不同的方式完成
    • @Amja,您可以考虑编辑您的问题并提供更多详细信息。对我来说,这个问题是模棱两可的。请检查答案中的编辑
    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多