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

resizing image with rmagick/imagemagick to be less than a specified product of its width and height

我是 运行 一个调整过大图像大小的脚本。我已经使用 "resize_to_fit" 根据较长的边将图像缩小到特定的像素大小,但我想知道是否可以使用此逻辑来代替:对于 width x 的任何图像height 产品大于设定值,调整图像大小,使新的宽度和高度值尽可能大,同时仍低于该值。换句话说,我不想随意调整不必要的尺寸,并且我想在此转换中保留纵横比。这可能更像是一道数学题,而不是 ruby 题,但无论如何,这是我试过的:

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。但是还有其他可能的 width x height 组合,其乘积可能比 2,906,960 更接近 4,000,000 像素。有没有办法确定该信息,然后相应地调整它的大小?

您需要正确计算 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