使用carrierwave

时间:2017-10-20 15:42:03

标签: imagemagick ruby-on-rails-5 carrierwave minimagick

在Ruby 5和MiniMagick上使用Carrierwave,是否可以修剪透明像素?

假设用户上传了500x500图像,但确实只填充了内部250x250像素,其余部分是透明的。是否有一个处理命令可以帮助在额外处理之前检测并修剪图像到250x250?

我发现https://www.imagemagick.org/discourse-server/viewtopic.php?t=12127并且似​​乎在Imagemagick上有一个trim transparent命令,但我不确定如何在Ruby包装器Minimagick中使用它?

1 个答案:

答案 0 :(得分:1)

MiniMagick::Image.trim就是我们所需要的。如果没有像素迭代器,最简单的方法是在克隆图像上应用trim,并对最小的结果进行操作。

require 'mini_magick'

def trimed_image(path)
  image = MiniMagick::Image.open(path)
  test_image = image.clone
  test_image.trim
  if test_image.width < image.width || test_image.height < image.height
    test_image
  else
    image
  end
end

使用convert rose: -resize x100 rose.png

的测试用例
rose = trimed_image("rose.png")
rose.write("rose_output.png")

预期无变化。

rose_output.png

使用convert -size 100x100 gradient: -background black -extent 200x200-50-50 -alpha copy trim.png

测试透明图像
trim = trimed_image("trim.png")
trim.write("trim_output.png")

修剪预期。

trim_output.png