如何使用Carrierwave和rmagick缩小图像,直到一方达到目标尺寸?
示例:
目标维度:600x400
正在上传的图片:700x450
我希望缩小此图像,直到高度达到400像素,保持原始高宽比。
这将导致图像具有以下尺寸:622x400
答案 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
这将符合目标尺寸,最大化尺寸,同时保持纵横比。