Размытие изображений с помощью Shrine и драгоценного камня image_processing

Я пытаюсь размыть изображения в своем приложении Ruby on Rails, используя драгоценный камень Shrine. Это мой файл загрузки:

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 Exception: convert /tmp/shrine20191112-4479-1xo3vgk.jpg -auto-orient -blur 0x5 -resize 1024x1024> -sharpen 0x1 /tmp/image_processing20191112-4479-1w094sa.jpg не удалось с ошибкой: convert: нераспознанная опция `-blur 0x5' @ error/convert.c/ConvertImageCommand/893. "

Без append('-blur 0x8') работает нормально, что я делаю не так? Моя версия ImageMagick: 7.0.7-11.

Кстати, я бы не возражал против размытия изображения с помощью libvips, у меня просто больше опыта работы с ImageMagick, так что я пошел с этим.


person trabant    schedule 12.11.2019    source источник


Ответы (2)


Вам нужно указать каждый аргумент командной строки отдельно, в данном случае -blur и 0x8:

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

Вы также можете вызвать метод #blur, который будет применяться как -blur с помощью магии method_missing:

magick.blur('0x8').resize_to_limit!(1024, 1024)
person janko-m    schedule 12.11.2019

Я думаю, что эквивалент 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 .

Если вы можете, сначала поставьте изменение размера, это намного быстрее. Вы также получите более последовательные результаты, поскольку степень размытия не будет зависеть от того, насколько велико изменение размера.

person jcupitt    schedule 14.11.2019