Использование Rmagick для изменения размера в первую очередь - PullRequest
5 голосов
/ 12 июля 2010

Я пытаюсь изменить размер изображения с помощью Rmagick, и если я использую метод resize_to_fit, чтобы всегда сначала изменять размер высоты, предпочитая его ширине, но мне кажется, что большинство моих изображений сначала изменяются до ширины. Есть ли в любом случае использование resize_to_fit метода, чтобы сказать ему "предпочитать высоту над шириной"?

Ответы [ 3 ]

12 голосов
/ 23 февраля 2012

Я не понимаю, что вы подразумеваете под , чтобы сначала изменить высоту .Так что, возможно, я не прав с моим ответом.

При изменении размера у вас есть три возможности: Вы можете сохранить соотношение (resize_to_fit) или обрезать изображение (resize_to_fill) или растянуть / сжать изображение (scale?)

С помощью resize_to_fit вы можете определить максимальную ширину и, необязательно, максимальную длину (по умолчанию заданная ширина).

Пример: img.resize_to_fit(300).В зависимости от вашего изображения вы получите изображение с максимальной шириной 300 или длиной 300. Другой размер рассчитывается по соотношению.Изображение 50x100 становится 150x300.Изображение размером 100x50 становится размером 300x150.

Если вы хотите изображение размером 300x400, которое не можете использовать img.resize_to_fit(300,400), оно проверит, какой размер подходит в первую очередь, и вычислит другое измерение в зависимости от него.

Если ваш предпочитает высоту над шириной означает, что вы хотите заданную высоту (например, 300), а ширина должна быть рассчитана по соотношению сторон изображения, вы можете использовать resize_to_fit(1000000, 300).Каждый раз, когда высота 300 будет достигнута до достижения ширины 1000000, ваша фотография получит высоту 300.

3 голосов
/ 15 июля 2010

Несколько мыслей и немного кода.

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

Не похоже, что API раскрывает способ растягивания в одну сторону, а затем в другую, но мы, безусловно, можем сделать метод или два, чтобы попробовать. Ниже представлены два подхода: первый, two_step_resize изменяет размеры в одном направлении, а другой - в другом. Второй, resize_with_rotate поворачивает изображение, изменяет его размер, а затем поворачивает его обратно.

В примерах, которые я провела, я не вижу странностей ни в одном решении.

require 'RMagick'


#Change the size in two steps, height first then width
def two_step_resize(img, filename, max_x, max_y)
  x = img.columns
  y = img.rows

  #make sure it's a float w/ the 1.0*
  ratio = (1.0*x)/y  

  new_y = max_y
  new_x = ratio * new_y

  if (new_x > max_x)
    new_x = max_x
    new_y = new_x / ratio
  end

  # do the change in two steps, first the height
  img.resize!(x, new_y);
  #then the width
  img.resize!(new_x, new_y)

  #save it, with the least compression to get a better image
  res.write(filename){self.quality=100}

end

#spin the image before resizing
def resize_with_rotate(img, output_filename, max_x, max_y)
  res = img.rotate(90).resize_to_fit(max_y, max_x).rotate(-90)
  res.write(output_filename){self.quality=100}
end

img = Magick::Image.read(filename).first
two_step_resize(img, "2-step.jpg", 100, 200)

img = Magick::Image.read(filename).first
resize_with_rotate(img, "rotate.jpg", 100, 200)
1 голос
/ 06 июня 2017

Вы можете указать максимальное значение высоты и позволить Rmagick вычислить соответствующую ширину, используя метод change_geometry .

Это может быть полезно, если вы хотите установить максимальную высоту изображения ландшафта и не хотите указывать соответствующую ширину, чтобы сохранить соотношение:

require "rmagick"
include Magick

img = ImageList.new("<path_to_your_img>") # assuming a landscape oriented img
img.change_geometry("x395") do |cols, rows, img| # set the max height 
  img.resize(cols, rows)
end

Помните, что вы всегда должны передавать блок методу изменения геометрии. Вы можете найти более подробную информацию в официальной документации .

Приветствия

...