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

Yeg*_*eps 2 ruby rmagick ruby-on-rails-3 carrierwave

你如何缩小图像直到一方用Carrierwave和rmagick达到它的目标维度?

例:

目标尺寸:600x400

正在上传的图片:700x450

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

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

rab*_*mar 6

你可以看看resize_to_limit.来自carrierwave文档:

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

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

process :resize_to_fill => [600, 400]
Run Code Online (Sandbox Code Playgroud)

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

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

编辑: 您可以阅读这些处理器的文档,以获取有关调整大小的更多选项

对于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
Run Code Online (Sandbox Code Playgroud)