Проблема с Carrierwave: конвертировать - PullRequest
5 голосов
/ 03 ноября 2011

Мне бы хотелось, чтобы Carrierwave выпустил несколько версий изображения, одно в формате png, другое в формате jpeg, но я не могу заставить его работать. Я понимаю, что несколько подобных вопросов задавались и здесь, и в других местах, но мне не удалось найти решение. Примерно вот что у меня есть:

class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick

  version :jpeg do 
    process :convert => 'jpg'
    # more procesors
    process :processed => :jpg
  end

  version :png do
    process :convert => 'png'
    # more processors 
    process :processed => :png
  end

  def store_path(for_file = filename)
    if version_name != :png
      return "#{version_name}.jpg"
    else
      return "#{version_name}.png"
    end
  end

  def filename
    filename = if version_name != :png
      super != nil ? super.split('.').first + '.jpg' : super
    else 
      super != nil ? super.split('.').first + '.png' : super
    end
  end

end

Таким образом, независимо от типа формата изображения, который я передаю, получаются два файла: один с именем jpg.jpg и один с именем png.png. jpg.jpg действительно всегда является файлом JPEG (как проверено командой Unix file), НО png.png является только истинным PNG-форматированным файлом, если и только если я первоначально передал в формате png-файл (передача в формате JPEG в файле формата jpeg)!

Идеи

Это может быть бесполезно, но я нахожу метод convert в самой Carrierwave подозрительным: convert(some_format) вызывает manipulate!(:format => some_format), что, в свою очередь, вызывает (some_image_object).write("#{some_format}:#{current_path}"). Теперь, если передано исходное изображение в формате bla.format (format = jpg, png и т. Д.), current_path с расширением .format (проверено с помощью monkey-patch на manipulate!). И способ преобразования формата изображения в RMagick заключается в вызове write с аргументом, имеющим желаемое расширение. Так почему же преобразование jpeg выше действительно имеет место? И если да, то почему преобразование PNG не удалось?

Также, если это полезно, я на Rails 3.0.9 и Carrierwave 0.5.6

Спасибо!

1 Ответ

5 голосов
/ 04 ноября 2011

Так что я не уверен , почему это так, но оказывается, что проблема в # more processors части версии png, которую я спрятал выше. Исключение их из версии приводит к подлинному файлу PNG для любого типа ввода. Эти процессоры вызывают manipulate! и делают некоторые вещи. Вместо этого вместо этого было вызвано manipulate!(:format => 'png'). Yay.

...