Мне бы хотелось, чтобы 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
Спасибо!