动态调整载波大小

use*_*643 6 ruby-on-rails on-the-fly ondemand image-resizing carrierwave

我正在使用载波,但我遇到了这个问题:假设项目交付后,您需要添加一个区域,其中需要以不同的大小显示系统中的图像。我不想为系统中已经存在的每个图像重新生成新的尺寸。我希望能够在需要视图时生成(并缓存它)。像这样:“ />。如果新的尺寸500x150已经存在,则返回缓存的URL,否则生成它并返回缓存的URL

我非常喜欢Carrierwave,但很遗憾,它没有开箱即用的即时调整大小功能。所有人都说添加此功能应该很简单,但是我什么也没发现。唯一接近的是此上传器https://gist.github.com/DAddYE/1541912 我必须对其进行修改才能使其正常工作,所以这里是我的版本

class ImageUploader < FileUploader
  include CarrierWave::RMagick

  #version :thumb do
  #  process :resize_to_fill => [100,100]
  #end
  #
  #version :thumb_square do
  #  process :resize_to_fill => [100,100]
  #end
  #
  #version :full do
  #  process :resize_to_fit => [550, 550]
  #end


  def re_size(string_size)
    if self.file.nil?
      return self
    end

    begun_at = Time.now
    string_size.gsub!(/#/, '!')
    uploader = Class.new(self.class)
    uploader.versions.clear
    uploader.version_names = [string_size]
    img = uploader.new(model, mounted_as)
    img.retrieve_from_store!(self.file.identifier)
    cached = File.join(CarrierWave.root, img.url)
    unless File.exist?(cached)
      img.cache!(self)

      img.send(:original_filename=, self.file.original_filename)
      size = string_size.split(/x|!/).map(&:to_i)
      resizer = case string_size
                  when /[!]/ then :resize_to_fit
                  # add more like when />/ then ...
                  else :resize_to_fill
                end
      img.send(resizer, *size)
      FileUtils.mv(img.file.file, cached)
      #img.store!
    end
    img
  end

  def extension_white_list
    %w[jpg jpeg gif png]
  end

  def filename
    Digest::MD5.hexdigest(original_filename) << File.extname(original_filename) if original_filename
  end

  def cache_dir
    "#{Rails.root}/tmp/uploads"
  end

  def default_url
    '/general/no-image.png'
  end
end
Run Code Online (Sandbox Code Playgroud)

此版本的问题是,显然,在调用re_size(“ 100x100”)。url时,将在创建实际调整大小的图像之前生成并返回该url,从而导致页面中的链接断开,从而在后续刷新时显示良好。

有人愿意分享更好的成绩吗?:)

请不要告诉我切换到蜻蜓。我正在使用Carrierwave,我真的很喜欢。它还与RailsAdmin无缝集成,这也是我的项目的一部分。

Chr*_*hol 0

为什么不生成图像的不同版本,例如缩略图?在你的image_uploader.rb

 # Create different versions of your uploaded files:

 include CarrierWave::RMagick


 version :thumb do
    process :resize_to_limit => [100, 100]
 end
Run Code Online (Sandbox Code Playgroud)

然后在你看来只需调用

 <%= image_tag nameofimage.image_url(:thumb).to_s %>
Run Code Online (Sandbox Code Playgroud)

您可以创建原始图像的多个版本,而无需调整原始图像的大小。该处理由您需要安装的 RMagick 完成。

RMagick 要求您拥有 ImageMagick,因此您还需要安装它。这些安装和工作可能有点棘手,但非常值得。另外,stackoverflow 社区针对这个问题提供了很多帮助。

在 Mountain Lion 上安装 Rmagick 时出错

rmagick gem install“找不到 Magick-config”