1

我正在尝试使用 Shrine gem 在我的 Ruby on Rails 应用程序中模糊图像。这是我的上传文件:

require "image_processing/mini_magick"

class ImageUploader < Shrine
  Attacher.derivatives_processor do |original|
    magick = ImageProcessing::MiniMagick.source(original)
    {
      blurred: magick.append('-blur 0x8').resize_to_limit!(1024, 1024)
    }
  end
end

我以最基本的方式设置模型、控制器和表单,与 Shrine 入门教程 - https://shrinerb.com/docs/getting-started中的相同。当我尝试保存图像时,出现以下错误:

*** MiniMagick::Error 异常:convert /tmp/shrine20191112-4479-1xo3vgk.jpg -auto-orient -blur 0x5 -resize 1024x1024> -sharpen 0x1 /tmp/image_processing20191112-4479-1w094sa.jpg因错误而失败:转换:无法识别的选项 `-blur 0x5' @error/convert.c/ConvertImageCommand/893。"

没有append('-blur 0x8')它就可以正常工作,我做错了什么?我的 ImageMagick 版本是7.0.7-11

顺便说一句,我不介意用 libvips 模糊图像,我只是对 ImageMagick 有更多的经验,所以我就是这么做的。

4

2 回答 2

2

您需要分别指定每个命令行参数,在这种情况下-blur0x8

magick.append('-blur', '0x8').resize_to_limit!(1024, 1024)

您还可以调用该#blur方法,该方法将-blur通过以下魔法应用method_missing

magick.blur('0x8').resize_to_limit!(1024, 1024)
于 2019-11-12T23:26:44.933 回答
2

我认为libvips等价物是:

require "image_processing/vips"

class ImageUploader < Shrine
  Attacher.derivatives_processor do |original|
    vips = ImageProcessing::Vips.source(original)
    {
      blurred: vips.resize_to_limit(1024, 1024).gaussblur(2).call
    }
  end
end

由于未知方法被简单地委托给 ruby​​-vips

如果可以,请先调整大小,这样会快很多。您还将获得更一致的结果,因为模糊程度不取决于调整大小的大小。

于 2019-11-14T11:08:44.720 回答