Dragonfly / imagemagick调整大小并裁剪,可能会添加白色填充

时间:2015-02-06 14:04:22

标签: ruby imagemagick imagemagick-convert dragonfly-gem

使用蜻蜓我可以做到以下几点:

image.thumb('300x300#')

这将调整图像大小,保持纵横比并集中裁剪(有效地切断最长边的末端)。

但是,如果图像边缘小于300px,则向上缩放。我更喜欢的是,在这种情况下,图像不会调整大小,而是在必要时添加白色填充。

所以基本上,如果两个边都是300px或更高,我想要300x300#的正常行为,但是如果任何边缘小于300px,那么图像根本没有调整大小,但仍然用空白裁剪为300x300必要时添加。

这是否可以使用Dragonfly的内置处理器(#thumb#convert?或者我是否需要构建自己的处理器?如果是这样,我会使用哪种imagemagick命令需要看看?

2 个答案:

答案 0 :(得分:1)

最佳解决方案是创建一个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

enter image description here

<小时/>

关于如何合成图像的Rmagick文档 - http://www.imagemagick.org/RMagick/doc/image1.html#composite

Rmagick宝石 - https://github.com/rmagick/rmagick

ImageMagick对合成的引用 - http://www.imagemagick.org/script/composite.php

答案 1 :(得分:1)

我有回答自己的问题的习惯......

使用Dragonfly可以完成以下任务:

def thumb_url
  if image.width < 300 || image.height < 300
    image.convert('-background white -gravity center -extent 300x300').url
  else
    image.thumb('300x300#').url
  end
end