【问题标题】:Carrierwave on the fly resizeCarrierwave 即时调整大小
【发布时间】:2013-10-18 14:19:04
【问题描述】:

我使用的是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 无缝集成。

【问题讨论】:

    标签: ruby-on-rails carrierwave image-resizing on-the-fly ondemand


    【解决方案1】:

    为什么不直接生成图像的不同版本,例如缩略图?在你的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 社区在这个问题上提供了很多帮助。

    Error installing Rmagick on Mountain Lion

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

    【讨论】:

    • 问题是大多数时候设计很差,我不知道开发前的确切图像尺寸,导致每次添加或发现新尺寸时都会无休止地重新调整大小的图像。我需要一种即时生成的方法
    • 以上内容会获取您的原始图像,无论尺寸如何,并将其调整到指定的尺寸限制。我不知道你所说的“在飞行中”是什么意思。
    • 我的意思是按需。假设一旦项目交付,您需要添加一个部分,其中系统中的图像需要以不同的大小显示。我不想为系统中已经存在的每个图像重新生成新维度。我希望能够在视图需要时生成(并缓存它)。类似于: " /> 。如果新的大小500x150已经存在,则返回缓存的url,否则生成并返回缓存的url
    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多