首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Carrierwave on the fly调整大小

Carrierwave on the fly调整大小
EN

Stack Overflow用户
提问于 2013-10-11 01:22:33
回答 1查看 1.5K关注 0票数 6

我正在使用carrierwave,我遇到了这个问题:假设项目交付后,您需要添加一个部分,其中系统中的图像需要以不同的大小显示。我不想为系统中已经存在的每个图像重新生成新的维度。我希望能够在视图需要的时候生成(并缓存它)。类似于:“/>。如果新的大小500x150已经存在,则返回缓存的url,否则生成它并返回缓存的url

我非常喜欢Carrierwave,但不幸的是,它没有任何即时调整大小的功能。每个人都说添加这个功能应该很简单,但我几乎什么也没找到。唯一非常接近的是这个上传程序https://gist.github.com/DAddYE/1541912,我必须修改它才能使它工作,所以这是我的版本

代码语言:javascript
复制
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无缝集成,这也是我的项目的一部分。

EN

回答 1

Stack Overflow用户

发布于 2013-10-11 02:21:24

为什么不直接生成一个不同版本的图像,比如缩略图?在你的image_uploader.rb

代码语言:javascript
复制
 # Create different versions of your uploaded files:

 include CarrierWave::RMagick


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

那么在您的视图中,只需调用

代码语言:javascript
复制
 <%= image_tag nameofimage.image_url(:thumb).to_s %>

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

RMagick要求您安装ImageMagick,因此您也需要安装它。安装和运行这些工具可能有点棘手,但很值得。另外,stackoverflow社区在这个问题上提供了很多帮助。

Error installing Rmagick on Mountain Lion

rmagick gem install "Can't find Magick-config"

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19302262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档