0

使用蜻蜓,我可以执行以下操作:

image.thumb('300x300#')

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

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

所以基本上,如果两个边缘都是 300 像素或以上,我想要正常的行为300x300#,但如果任何边缘小于 300 像素,则图像根本不会调整大小,但仍会裁剪为 300x300,并在必要时添加空白。

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

4

2 回答 2

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
于 2015-02-06T19:45:30.867 回答
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

在此处输入图像描述


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

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

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

于 2015-02-06T14:26:21.673 回答