使用rmagick / imagemagick调整图像大小,使其小于宽度和高度的指定乘积

时间:2017-10-24 16:27:56

标签: ruby math imagemagick rmagick

我正在运行一个脚本来调整太大的图像。我已经使用“resize_to_fit”将图像缩小到特定像素大小,具体取决于长边,但我想知道是否可以使用此逻辑来实现:对于 width x height product大于设定值,调整图像大小,使新宽度和高度值尽可能大,同时仍然低于该值。换句话说,我不想任意调整尺寸超过必要的尺寸,我想在此转换中保留纵横比。这可能更像是一个数学问题,而不是红宝石问题,但无论如何,这是我试过的:

image = Magick::Image.read(image_file)[0];
dimensions = image.columns, image.rows
resolution = dimensions[0] * dimensions[1]
if resolution > 4000000
   resolution_ratio = 4000000 / resolution.to_f
   dimension_ratio = dimensions[0].to_f * resolution_ratio
   img = img.resize_to_fit(dimension_ratio,dimension_ratio)
   img.write("#{image}")
end

因此,假设图像的宽度为2793像素,高度为1970像素。决议将是5,502,210。因此,它通过条件声明,并且截至目前,输出新的宽度2030和高度1432.这两个的产品是2,906,960 - 显然远低于4,000,000。但是还有其他可能的宽度x高度组合,其产品可能比2,906,960更接近4,000,000像素。有没有办法确定信息,然后相应地调整大小?

1 个答案:

答案 0 :(得分:2)

您需要正确计算ratio,这是您所需维度的平方根除以(row乘以col):

row, col = [2793, 1970]
ratio = Math.sqrt(4_000_000.0 / (row * col))
[row, col].map &ratio.method(:*)
#⇒ [
#  [0] 2381.400006266842,
#  [1] 1679.6842149465374
#]
[row, col].map(&ratio.method(:*)).reduce(:*)
#∞ 3999999.9999999995