缩小图像直到一侧达到目标尺寸

时间:2011-12-01 14:53:42

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

如何使用Carrierwave和rmagick缩小图像,直到一方达到目标尺寸?

示例:

目标维度:600x400

正在上传的图片:700x450

我希望缩小此图像,直到高度达到400像素,保持原始高宽比。

这将导致图像具有以下尺寸:622x400

2 个答案:

答案 0 :(得分:6)

您可以查看resize_to_limit。来自carrierwave docs:

  

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

所以你可以在你的上传器中做这样的事情:

process :resize_to_fill => [600, 400]

如果您不介意裁剪图像,可以改为resize_to_fit,然后使用您想要的重力值:

  

从RMagick文档:“调整图像大小以适应指定的尺寸,同时保留原始高宽比。图像可能比较小尺寸中指定的更短或更窄,但不会大于指定值。“

修改 对于这些处理器,您可以read the documentation获取有关调整大小的更多选项

对于只强制宽度和高度最小尺寸的resize_to_min实施,您可以将resize_to_limit作为基础,只需将几何设置修改为MinimumGeometry即可创建自定义处理器:

  process :resize_to_min => [600, 400]

  def resize_to_min(width, height)
    manipulate! do |img|
      geometry = Magick::Geometry.new(width, height, 0, 0, Magick::MinimumGeometry)
      new_img = img.change_geometry(geometry) do |new_width, new_height|
        img.resize(new_width, new_height)
      end
      destroy_image(img)
      new_img = yield(new_img) if block_given?
      new_img
    end
  end

答案 1 :(得分:1)

使用代数:http://www.algebrahelp.com/lessons/proportionbasics/pg2.htm

自622px> 600px,您需要将宽度设置为600px并计算保持纵横比的正确高度:

700/450 = 600/x
(700/450)*x = 600
x = 600/(700/450)
x ~= 386

您想要的尺寸是:600px x 386px

这将符合目标尺寸,最大化尺寸,同时保持纵横比。