Я мог бы кодировать изображения в Progressive JPEG, выполнив следующие действия в моем CarrierWave Uploader:
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process :optimize #For the real image
version :version_1 do
# other processes
process :optimize
end
version :version_2, from_version: :version_1 do
# other processes
process :optimize
end
version :version_3, from_version: :version_2 do
# other processes
process :optimize
end
def optimize
manipulate! do |img|
img.combine_options do |c|
c.strip
c.quality '100'
c.depth '8'
c.interlace 'Line'
end
img
end
end
end
Вы должны поставить последним процесс, который преобразует изображение в Progressive JPEG, иначе оно не будет преобразовано.
Тогда, если вы уже загрузили несколько изображений и хотите их «воссоздать».Представьте, что ваша модель:
class Picture < ActiveRecord::Base
mount_uploader :image, ImageUploader
end
Итак, вам нужно сделать следующее, чтобы воссоздать версии:
Picture.order("id ASC").each do |p|
p.image.recreate_versions!
puts "#{p.id}, #{p.image.url}"
end
Я заказал картинку на основе идентификатора, потому что если она не работает вВ середине процесса у меня есть идентификатор, и я могу продолжить с этого идентификатора.Другая вещь, которую вы можете сделать, это спасти любое исключение и сохранить в массиве изображения, которые не удалось, что-то вроде этого:
errored = []
Picture.order("id ASC").each do |p|
begin
p.image.recreate_versions!
rescue => e
errored << p.id
end
puts "#{p.id}, #{p.image.url}"
end
Наконец, чтобы проверить, что изображение было преобразовано в Progressive JPEG, с установленным ImageMagickвведите в терминале следующее:
identify -verbose PATH_TO_IMAGE | grep Interlace
Если изображение является прогрессивным JPEG, вывод будет Interlace: JPEG
, если нет Interlace: None