最好的解决方案是创建一个 300x300 的白色画布图像,然后在画布图像顶部合成您的图像,居中。然后用重心(居中)裁剪它。这将产生一个 300x300 的图像,其中任何垂直或水平边缘上的白色画布尺寸小于 300。
** 对于这个解决方案,您可能需要安装 RMagick gem,因为我不相信 Dragonfly 已经扩展了您需要的 ImageMagick 操作。
这就是我的处理方式:
#Set file path first and load a white image called canvas that is 300x300 into Imagmagik
canvas_file_path = "#{Rails.root}/app/assets/images/canvas.png"
canvas_image = Magick::Image.read(canvas_file_path).first
#Then perform the compositing operation. This overlays your image on top of the canvas, center gravity ensures that your image is centered on the canvas.
canvas_image.composite!(<YOUR IMAGE>, CenterGravity, Magick::OverCompositeOp)
#then write the file to a temporary file path so you can do something with it
temporary_file_path = "#{Rails.root}/tmp/#{@model.id}"
canvas_image.write(temporary_file_path)
一定要在你的文件中添加require语句,注意大小写,它是RMagick而不是Rmagick
require "RMagick"
此处参考文档中的 ImageMagick 示例,以执行您需要的合成操作
composite -gravity center smile.gif rose: rose-over.png
关于如何合成图像的 Rmagick 文档 - http://www.imagemagick.org/RMagick/doc/image1.html#composite
Rmagick 宝石 - https://github.com/rmagick/rmagick
ImageMagick 对合成的参考 - http://www.imagemagick.org/script/composite.php