Уменьшайте изображение, пока одна сторона не достигнет цели - PullRequest
2 голосов
/ 01 декабря 2011

Как уменьшить изображение до тех пор, пока одна из сторон не достигнет целевого измерения с помощью Carrierwave и rmagick?

Пример:

Размеры цели: 600x400

Загружаемое изображение:700x450

Я хочу уменьшить это изображение, пока высота не достигнет 400 пикселей, сохраняя исходное соотношение сторон.

Это приведет к изображению со следующими размерами: 622x400

Ответы [ 2 ]

6 голосов
/ 01 декабря 2011

Вы можете взглянуть на resize_to_limit. Из документов перевозчика:

Изменение размера изображения в соответствии с указанными размерами при сохранении исходного соотношения сторон. Изменит размер изображения, только если оно больше указанного размера. Результирующее изображение может быть короче или уже, чем указано в меньшем измерении, но не будет больше указанных значений.

Так что вы можете сделать что-то подобное в своем загрузчике:

process :resize_to_fill => [600, 400]

Если вы не возражаете, чтобы обрезать изображение, вы можете вместо этого выбрать resize_to_fit и использовать желаемое значение гравитации:

Из документации RMagick: «Измените размер изображения в соответствии с указанными размерами, сохранив исходное соотношение сторон. Изображение может быть короче или уже, чем указано в меньшем измерении, но не может быть больше указанных значений. «

Edit: Вы можете прочитать документацию для этих процессоров, чтобы узнать больше об изменениях размера

Для реализации 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 голос
/ 01 декабря 2011

Используйте алгебру: 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

Ваш желаемый размерis: 600px x 386px

Это будет соответствовать размерам цели, максимизируя размер, сохраняя соотношение сторон.

...