Carrierwave即时调整大小

6
我正在使用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

这个版本存在的问题是,当调用re_size("100x100").url时,URL会在实际调整大小的图像创建之前生成并返回,导致页面上出现了损坏的链接,但在任何后续刷新中都会正常显示。
有人获得了更好的结果愿意分享吗? :)
请不要告诉我换用Dragonfly。我正在使用Carrierwave,并且非常喜欢它。而且它与我的项目中的RailsAdmin无缝集成。
1个回答

0
为什么不生成一个不同版本的图像,比如缩略图?在你的image_uploader.rb中。
 # Create different versions of your uploaded files:

 include CarrierWave::RMagick


 version :thumb do
    process :resize_to_limit => [100, 100]
 end

然后在你的视图中调用它

 <%= image_tag nameofimage.image_url(:thumb).to_s %>

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

RMagick要求您拥有ImageMagick,因此您也需要安装它。这些可能有点棘手,但非常值得。此外,stackoverflow社区已经为此问题提供了很多帮助。

在Mountain Lion上安装Rmagick时出错

rmagick gem install "找不到Magick-config"


问题在于大多数情况下设计很糟糕,我不知道开发前准确的图像尺寸,导致每次添加或发现一个新的尺寸时都需要无休止地生成调整大小的图像。我需要一种即时生成的方法。 - user711643
以上代码将您的原始图像,无论其尺寸如何,调整为指定的尺寸限制。我不知道您所说的“on the fly”是什么意思。 - ChrisBarthol
1
我的意思是按需求生成。假设一旦项目已经交付,您需要添加一个部分,其中系统中的图像需要以不同的大小显示。我不想为系统中已有的每个图像重新生成新的尺寸。我希望能够在视图要求时生成(并缓存)它。类似于:<IMG src="<%= @user.profile.image.size("500x150").url %>" /> 如果新的尺寸500x150已经存在,则返回缓存的URL,否则生成并返回缓存的URL。 - user711643

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接