Несколько мыслей и немного кода.
Какие различия вы видите? Как вы можете определить ширину? Я не вижу случая, когда конечный результат должен быть другого размера, если это проблема качества, пример может помочь.
Не похоже, что 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)