Добавляя к ответу Василия, я придумал следующее:
after :store, :convert_original_to_jpg
def convert_original_to_jpg(new_file)
if version_name.nil?
system("mogrify -format jpg -quality 80 #{file.file}")
system("unlink #{file.file}") # Remove the old PNG file
model.update_column mounted_as, "#{mounted_as}.jpg" # The filename in the DB also needs to be manually set to .jpg!
end
end
Хотя это работает для создания файла, но не при обновлении файла, так как параметр new_file
тогда равен nil
и, таким образом, все изображения удалены.
Я думаю, что это какая-то особенность, связанная с самоцветом carrierwave-base64, и у меня нет никакой мотивации углубляться в это. Таким образом, предлагаемое решение может быть не слишком полезным, но ради документации я хотел бы опубликовать его здесь.
В моем особом случае я решил дать go идею экономии дискового пространства путем преобразования PNG в JPG. Вместо этого я просто установил process quality: 80
, чтобы сэкономить хотя бы немного места в версиях.
Для исходного PNG (который сохраняется в без потерь с помощью гема carrierwave-base64), я просто использую следующий код для сжатия его качество:
after :store, :optimise_images
def optimise_images(new_file)
return if Rails.env.test? # Optimising consumes quite some time, so let's disable it for tests
if version_name.nil?
image_optim = ImageOptim.new pngout: false,
svgo: false,
pngcrush: false,
optipng: false,
pngquant: {allow_lossy: true}, # Everything disabled except pngquant, to keep the performance at a good level
advpng: false
image_optim.optimize_images!(Dir["#{File.dirname(file.file)}/*.png"])
end
end