Как вы генерируете jpeg-изображения с поддержкой Retina (iPad) (прогрессивные или чересстрочные) в CarrierWave? - PullRequest
4 голосов
/ 25 марта 2012

Имеются многочисленные сообщения о том, что Mobile Safari сокращает очень большие изображения JPEG, что затрудняет вывод разрешений с сетчатки для нового iPad.

Решение, по-видимому, заключается в кодировании JPEG в виде прогрессивных / чересстрочных файлов.Поэтому мне любопытно, как я мог бы использовать плагин CarrierWave и RMagick по расширению для генерации файлов этого типа.

Спасибо!

Ответы [ 4 ]

7 голосов
/ 27 июля 2012

Вы можете использовать MiniMagick :

manipulate! do |img|
  img.strip
  img.combine_options do |c|
    c.quality "90"
    c.depth "8"
    c.interlace "plane"
  end
  img
end
4 голосов

На сегодняшний день вам понадобится версия репозитория carriewave, так как поддержка options[:write] еще не выпущена.

Поэтому в вашем Gemfile используйте следующее:

gem 'carrierwave', :github => "jnicklas/carrierwave"

Затем в своем загрузчике вы можете определить что-то вроде следующего:

version :big do
  process :resize_to_limit => [1024, 1024]
  process :optimize
end

def optimize
  manipulate! do |img, index, options|
    options[:write] = {
      :quality => 90, # Change the quality to 90%
      :depth => 8, # Set the depth to 8 bits
      :interlace => "Magick::PlaneInterlace" # Add progressive support for JPEG
    }
    img.strip! # Remove profile data
  end
end

Полезная ссылка: http://www.imagemagick.org/RMagick/doc/constants.html#InterlaceType

Наслаждайтесь!

3 голосов
/ 18 декабря 2012

Я упаковал решения как драгоценный камень https://github.com/jhnvz/retina_rails

Все, что вам нужно сделать, это:

  1. Добавьте gem 'retina_rails' в свой Gemfile.
  2. Выполнить bundle install.
  3. Добавьте //= require retina в свой файл манифеста Javascript (обычно находится в app / assets / javascripts / application.js).

Carrierwave

  1. Добавьте include RetinaRails::CarrierWave в конец вашего загрузчика

    class ExampleUploader < CarrierWave::Uploader::Base
    
      version :small do
        process :resize_to_fill => [30, 30]
      end
    
      include RetinaRails::CarrierWave
    
    end
    

Скрепка

  1. Добавьте include RetinaRails::Paperclip в конец вашего загрузчика

    class ExampleUploader < ActiveRecord::Base
    
      has_attached_file :image,
        :styles => {
           :original => ["800x800", :jpg],
           :big => ["125x125#", :jpg]
         }
    
      include RetinaRails::Paperclip
    
    end
    

Драгоценный камень автоматически генерирует версии сетчатки (добавляет @ 2x к имени файла) на основе определенных вами версий в загрузчике. Js проверяет, есть ли у пользователей отображение на сетчатке и, если да, добавляет @ 2x к имени файла изображения.

0 голосов
/ 28 апреля 2016

Я мог бы кодировать изображения в 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

...