Carrierwave:如果尺寸大于(有条件地创建版本),则缩放图像

时间:2012-09-12 15:18:56

标签: ruby-on-rails-3 carrierwave minimagick

只有当图像大于版本的大小时,才能使用carrierwave创建一个版本(例如拇指)?

示例:

version :thumb, :if => :is_thumbnable? do 
    process :resize_to_fit => [32,nil]
end

protected

def is_thumbnable?(file)
  image ||= MiniMagick::Image.open(file.path)
  if image.nil?
    if image['width'] >= 32 || image['height'] >= 32
      true
    else
      false
    end
  else
    false
  end
end

3 个答案:

答案 0 :(得分:7)

我尝试了它们并不适合我。 在调整开发中的大图像时,我将服务器阻止。

  • carrierwave(0.9.0)
  • rmagick(2.13.2)

所以我看一下文档:http://carrierwave.rubyforge.org/rdoc/classes/CarrierWave/RMagick.html

有一个很棒的功能:resize_to_limit(width, height)

  

调整图像大小以适合指定的尺寸,同时保留原始高宽比。仅当图像大于指定尺寸时才会调整图像大小。生成的图像可能比较小的尺寸中指定的更短或更窄,但不会大于指定的值。

我的代码如下:

version :version_name, from_version: :parent_version_name do
    process resize_to_limit: [width, nil]
end

只有在宽度较大时才调整大小以适应宽度,与w / h的比率相符。

答案 1 :(得分:4)

我定义了一种方法,如果图像超过给定宽度,则在这种情况下将其操作为32像素。将此代码放入ImageUploader:

  version :thumb do 
    process :resize_to_width => [32, nil]
  end

  def resize_to_width(width, height)
    manipulate! do |img|
      if img[:width] >= width
        img.resize "#{width}x#{img[:height]}"
      end
      img = yield(img) if block_given?
      img
    end
  end

答案 2 :(得分:0)

实际上@Roza解决方案对我不起作用。 我不得不修改这样的方法:

process :resize_to_width => [650, nil]

def resize_to_width(width, height)
  manipulate! do |img|
    if img.columns >= width
      img.resize(width)
    end
    img = yield(img) if block_given?
    img
  end
end

我使用rmagick(2.13.2)和rails 3.2.13,carrierwave(0.8.0)