アイデアはシンプルで新しいものではありません。 私は最初にこのアプローチにUMI-CMSで出会いましたが、RubyOnRailsでそれを使用しました。 重要なのは、プレビューは必要なときにのみ作成され、任意のサイズであり、元の名前のみがデータベースに保存されるということです。
画像のプレビューを表示する必要がある場合は、次のような関数を呼び出します。
ここで、2番目と3番目のパラメーターは、ピクセル単位の目的のサイズです(自動はスケールに合わせて自動調整されることを意味します)。
@thumbs = Photo. view_thumbs ( 'originals_name_file.jpg' , '100' , 'auto' )
view_thumbsメソッドは、フォルダー(「/ images / cache」など)でファイルoriginals_name_file_100xauto.jpgの存在をチェックします。 見つかった場合は、文字列「originals_name_file_100xauto.jpg」を返します。見つからない場合は、適切なサイズのファイルをその場で作成し、同じものを返します。
このアプローチの利点は明らかです。
- ディスク上に大量のサムネイルの形でゴミが作成されることはありません。 すべてのプレビューは1つのキャッシュフォルダーに保存され、定期的に削除してスペースを解放できます。
- さまざまなサイズの無制限のサムネイル。 メソッドに必要なパラメーターを設定するだけで十分です。
- 「RMagick」が 必要
- クラス Photo < ActiveRecord :: Base
- デフセルフ 。 view_thumbs (画像、幅= 'auto' 、高さ= 'auto' )
- img_arr =画像。 分割 ( "。" )
- img、img_type = img_arr [ 0 ] 、img_arr [ 1 ]
- img_thumbs = "#{img} _#{width} x#{height}"
- img_main_dir = "#{RAILS_ROOT} / public / images /"
- img_thumbs_dir = "#{RAILS_ROOT} / public / images / cache /"
- 始める
- img_thumbs = Magick :: Image 。 読み取り ( "#{img_thumbs_dir} /#{img_thumbs}。#{img_type}" )
- rescue Magick :: ImageMagickError #すべての塩はここにあります。 必要な親指がない場合は、エラーを読み取った後に抜けてしまい、保存します。 すべてが正常であれば、コードはそれ以上実行されません
- img_orig = Magick :: Image read ( "#{img_main_dir} /#{image}" ) 。 最初に
- img_size = { :main => { :cols => img_orig。 列 、:行=> img_orig。 行 } 、
- :thumb => { :cols => 0.0 、: rows => 0.0 }
- }
- 'auto' == width および 'auto' == heightの場合
- img_size [ :thumb ] [ :rows ] = img_size [ :main ] [ :rows ]
- img_size [ :thumb ] [ :cols ] = img_size [ :main ] [ :cols ]
- 終わり
- if 'auto' != width および 'auto' == height
- img_size [ :thumb ] [ :rows ] = ( ( width。to_f / img_size [ :main ] [ :cols ] ) * img_size [ :main ] [ :rows ] ) 。 to_i
- img_size [ :thumb ] [ :cols ] =幅。 to_i
- 終わり
- if 'auto' == width and 'auto' != height
- img_size [ :thumb ] [ :rows ] =高さ。 to_i
- img_size [ :thumb ] [ :cols ] = ( ( height。to_f / img_size [ :main ] [ :rows ] ) * img_size [ :main ] [ :cols ] ) 。 to_i
- 終わり
- if 'auto' !=幅および 'auto' !=高さ
- img_size [ :thumb ] [ :rows ] =高さ。 to_i
- img_size [ :thumb ] [ :cols ] =幅。 to_i
- 終わり
- img_new = img_orig。 サイズ変更 ! ( img_size [ :thumb ] [ :cols ] 。to_i 、img_size [ :thumb ] [ :rows ] 。to_i )
- img_new。 「#{img_thumbs_dir} /#{img_thumbs}。#{img_type}」と 書く
- 終わり
- img_thumbs = x
- return "#{img_thumbs}。#{img_type}"
- 終わり
- 終わり
練習では、メソッドで1つのサイズのみを指定し、別のサイズを自動的に調整するだけでは十分ではないことが示されています。 幅のみで制限すると、画像が高すぎて、レイアウト全体が移動してしまいます。 高さも同じです。 また、上記のコードでは、高さと幅の両方を指定すると、スケールを保持せずにサイズ変更が行われます。 以下は、マス本社を維持しながら、高さと幅の両方に制限のあるサイズ変更を実装するphpコードです。
______________________
- $ img_size = array (
- 'main' =>配列( 'width' => imagesx ( $ img_src ) 、 'height' => imagesy ( $ img_src ) ) 、
- 'thumb' =>配列( 'width' => 0 、 'height' => 0 )
- ) ;
- if ( 'auto' == $ width && 'auto' == $ height ) {
- $ img_size [ 'thumb' ] [ 'height' ] = ( int ) $ img_size [ 'main' ] [ 'height' ] ;
- $ img_size [ 'thumb' ] [ 'width' ] = ( int ) $ img_size [ 'main' ] [ 'width' ] ;
- }
- else if ( 'auto' != $ width && 'auto' == $ height ) {
- $ img_size [ 'thumb' ] [ 'width' ] = ( ( $ img_size [ 'main' ] [ 'width' ] <= $ width ) ? $ img_size [ 'main' ] [ 'width' ] : $ width ) ;
- $ img_size [ 'thumb' ] [ 'height' ] = ( int ) round ( ( $ img_size [ 'thumb' ] [ 'width' ] / $ img_size [ 'main' ] [ 'width' ] ) * $ img_size [ ' main ' ] [ ' height ' ] )) ;
- }
- else if ( 'auto' == $ width && 'auto' != $ height ) {
- $ img_size [ 'thumb' ] [ 'height' ] = ( ( $ img_size [ 'main' ] [ 'height' ] <= $ height ) ? $ img_size [ 'main' ] [ 'height' ] : $ height ) ;
- $ img_size [ 'thumb' ] [ 'width' ] = ( int ) round ( ( $ height / $ img_size [ 'main' ] [ 'height' ] ) * $ img_size [ 'main' ] [ 'width' ] ) ;
- }
- else if ( 'auto' != $ width && 'auto' != $ height ) {
- $ img_size [ 'thumb' ] [ 'height' ] = ( ( $ img_size [ 'main' ] [ 'height' ] <= $ height ) ? $ img_size [ 'main' ] [ 'height' ] : $ height ) ;
- $ img_size [ 'thumb' ] [ 'width' ] = ( ( $ img_size [ 'main' ] [ 'width' ] <= $ width ) ? $ img_size [ 'main' ] [ 'width' ] : $ width ) ;
- $ Kt = $ img_size [ 'thumb' ] [ 'height' ] / $ img_size [ 'thumb' ] [ 'width' ] ; // 5/1
- $ Km = $ img_size [ 'main' ] [ 'height' ] / $ img_size [ 'main' ] [ 'width' ] ; // 5/1
- if ( $ Kt > $ Km ) {
- $ img_size [ 'thumb' ] [ 'height' ] = $ img_size [ 'thumb' ] [ 'width' ] * $ Km ;
- }
- else if ( $ Kt < $ Km ) {
- $ img_size [ 'thumb' ] [ 'width' ] = $ img_size [ 'thumb' ] [ 'height' ] / $ Km ;
- }
- }