Carrierwave/Minimagick не обрабатывает изображения после загрузки

У меня возникли проблемы с реализацией простого загрузчика изображений с драгоценными камнями Carrierwave/Minimagick в RoR.

Я пытаюсь преобразовать файл в оттенки серого при загрузке, но получаю сообщение об ошибке. Вот код:

image_uploader.rb:

class ImageUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Process files as they are uploaded:
   process :convert_to_grayscale

  def convert_to_grayscale
    manipulate! do |img|
      img.quantize(256, Magick::GRAYColorspace)
      img = yield(img) if block_given?
      img
    end
  end

Когда я пытаюсь загрузить файл, я получаю следующую ошибку:

uninitialized constant ImageUploader::Magick

app/uploaders/image_uploader.rb:36:in `block in convert_to_grayscale'
app/uploaders/image_uploader.rb:35:in `convert_to_grayscale'

Я считаю, что это связано с константой перечисления Magick::GRAYColorspace. Любые идеи, почему это не работает?


person diego    schedule 30.01.2013    source источник


Ответы (1)


Является ли функция manipulate, которая загружает изображения в память? Возвращает ли он список изображений?

Я думаю, что изображения не загружаются правильно. Проблема не в перечислении Magick.

Вот пример:

require 'RMagick'

clown = Magick::ImageList.new("clown.jpg")
clown = clown.quantize(256, Magick::GRAYColorspace)
clown.write('monochrome.jpg')
person jbatista    schedule 30.01.2013
comment
Вот что говорится в документации по несущей волне об манипулировании!(): манипулирование!() Манипулируйте изображением с помощью RMagick. Этот метод загрузит изображение, а затем передаст каждый из его кадров в предоставленный блок. Затем он сохранит изображение на диск. Gotcha Этот метод предполагает, что объект отвечает на current_path. Любой класс, с которым смешивается этот модуль, должен иметь метод current_path. CarrierWave::Uploader делает это, поэтому в большинстве случаев вам не нужно беспокоиться об этом. Выдает MiniMagick::Image манипуляции для выполнения. Вызывает CarrierWave::ProcessingError, если манипуляция не удалась. - person diego; 30.01.2013