2

我想调整/缩放图像。原件的尺寸与 300x200 或 512x600 不同。我想将图像大小调整为 100x100,但不要从图像中裁剪任何内容或更改比例。理想情况下,图像首先将长边缩放为 100(纵横比),然后用白色填充较小的边。

 .---------.
 |- - - - -|
 |  IMAGE  |
 |- - - - -|
 '---------'

我不使用 Paperclip 或 Rails,只使用 RMagick。

4

4 回答 4

8

我已经完成了将调整大小的图像与新的 100x100 图像合并。这肯定不是最好的方法,但它有效:

img = Magick::Image.read("file.png").first
target = Magick::Image.new(100, 100) do
  self.background_color = 'white'
end
img.resize_to_fit!(100, 100)
target.composite(img, Magick::CenterGravity, Magick::CopyCompositeOp).write("file-small.png)
于 2011-01-13T17:12:49.047 回答
1

玩了一段时间后,我得到了 Fu86 的复合技巧,如下所示:

img = Image.read("some_file").first().resize_to_fit!(width, height)
target = Image.new(width, height) do
    self.background_color = 'white'
end
target.composite(img, CenterGravity, AtopCompositeOp).write("some_new_file")

AtopCompositeOp似乎比CopyCompositeOp,由于某种原因,它使我的部分背景变黑了。

于 2013-03-20T02:24:30.833 回答
1
image = Magick::Image.read("filename").first
resized = image.resize_to_fit(width, height)     # will maintain aspect ratio, so one of the resized dimensions may be less than the specified dimensions
resized.background_color = "#FFFFFF"             # without a default, background color will vary based on the border of your original image
x = (resized.columns - width) / 2                # calculate necessary translation to center image on background
y = (resized.rows - height) / 2
resized = resized.extent(width, height, x, y)    # 'extent' fills out the resized image if necessary, with the background color, to match the full requested dimensions. the x and y parameters calculated in the previous step center the image on the background.
resized.write("new_filename")

注意:在 heroku 上,截至本文发布时使用 imagemagick 6.5.7-8,我需要将 x 和 y 翻译乘以 -1(并发送正数)。版本 6.8.0-10 需要负数。

于 2013-11-20T11:52:13.703 回答
0

看来您想使用change_geometry ...

于 2011-02-19T23:42:00.693 回答