5

我正在尝试使用 Rmagick 调整图像的大小,如果我使用该resize_to_fit方法总是首先调整高度,而不是宽度,但似乎我的大多数图像都首先调整为宽度。无论如何使用该resize_to_fit方法告诉它“更喜欢高度而不是宽度”?

4

3 回答 3

12

我不明白你的意思是先调整高度。所以也许我的回答错了。

调整大小时,您有三种可能性:您可以保持比例 ( 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). 每次在达到宽度 1000000 之前达到高度 300,您的图片将获得高度 300。

于 2012-02-23T13:14:54.667 回答
3

一些想法和一些代码。

你看到什么不同?你怎么能先知道它的宽度?我没有看到最终结果应该是不同大小的情况,如果这是一个质量问题,一个例子可能会有所帮助。

看起来 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)
于 2010-07-15T00:45:10.120 回答
1

您可以指定最大高度,并让 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

请记住,您始终必须将块传递给更改几何方法。您可以在官方文档中找到更多信息。

干杯

于 2017-06-06T09:23:32.253 回答