2012-03-24 17 views
4

モバイルサファリは非常に大きなJPEG画像をダウンサンプリングして、新しいiPadに網膜にやさしい解像度を出すのを困難にしているという報告が多数あります。どのようにCarrierWaveで網膜(iPad)フレンドリー(プログレッシブまたはインターレース)のJPEG画像を生成しますか?

解決策は、プログレッシブ/インターレースファイルとしてJPEGをエンコードしているようです。 したがって、このタイプのファイルを生成するために、CarrierWaveプラグインと拡張機能別のRMagickをどのように使用すればよいか不思議です。

ありがとうございます!

答えて

4

現時点では、options[:write]というサポートがまだリリースされていないため、現在のバージョンのcarriewaveが必要です。

だからあなたの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

をお楽しみください!

+0

になりますが、その後RMagickでのみ可能このですか? – Agustin

+0

上記の解決策はあります。私は他の画像編集ライブラリで試してみませんでしたが、そのような方法のサポートを探してみることができます。 –

6

あなたはMiniMagickを使用することができます。

manipulate! do |img| 
    img.strip 
    img.combine_options do |c| 
    c.quality "90" 
    c.depth "8" 
    c.interlace "plane" 
    end 
    img 
end 
3

私はあなたがしなければならない宝石https://github.com/jhnvz/retina_rails

Alなどのソリューションをパッケージ化しましたです:

  1. あなたのGemfileにgem 'retina_rails'を追加します。
  2. 実行bundle install
  3. あなたのJavascriptマニフェストファイル(通常はapp/assets/javascripts/application.jsにあります)に//= require retinaを追加します。

Carrierwave

  1. あなたのアップローダー

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

の底にinclude RetinaRails::CarrierWaveを追加ペーパークリップ

  1. は宝石が自動的アップローダーであなたの定義されたバージョンに基づいて網膜のバージョン(ファイル名に2倍@追加)を生成し、あなたのアップローダーの下

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

include RetinaRails::Paperclipを追加します。 jsは、ユーザーが網膜ディスプレイを持っているかどうかを確認し、そうであれば@ 2xを画像ファイル名に追加します。

+0

ここで問題は、私たちは@ 3xの画像を持っているということです!このトピックに関する別の議論があります。https://stackoverflow.com/questions/25781422/image-resolution-for-new-iphone-6-and-6-3x-support-added –

0

私は私のCarrierWaveアップローダに次のことをやってプログレッシブJPEGに画像を符号化することができます:

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 

あなたはそれ以外の場合は変換されませんプログレッシブ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 

私はそれが途中で失敗したのであればIDに基づいて画像を命じ は、あなたのモデルがあることを想像してみて私はIDを持っており、そのIDから続けることができます。最後に

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 

、画像がImageMagickのがインストールされ、プログレッシブJPEGに変換されたことを確認するために、タイプ:あなたがすることができるもう一つは、任意の例外を救出し、配列に失敗した画像を保存、このようなものですターミナルで次のよう

identify -verbose PATH_TO_IMAGE | grep Interlace 

画像はプログレッシブJPEGの場合、出力はInterlace: JPEG、そうでない場合はInterlace: None

関連する問題