GIFアニメーションのサムネイルを完璧に実現

2397 ワード

サムネイルはよく使われる機能です.その実現は複雑ではないが、原図がGIFアニメーションであれば、問題は煩雑になり、CS匪賊ゲームから取ったGIFアニメーションで問題を説明する.
  
 
  old.gif
問題をより明確にするには、まずアニメーションの各フレームを復元します.
選択一:PHPのImagickモジュールで:
  •  

  • $image = new Imagick('old.gif');  
  •  

  • $i = 0;  
  •  

  • foreach ($image as $frame) {  
  •     $frame->writeImage('old_' . $i++ . '.gif');  

  • }  
  •  

  • ?> 
    選択2:ImageMagickで提供されるconvertコマンド:
    shell> convert old.gif old_%d.gif 
    その結果、GIFアニメーションの各フレームの概略図を以下に示す.
      
     
    GIFアニメーションの各フレームの概略図
    GIFアニメーションは圧縮のために最初のフレームをテンプレートとし、残りのフレームは適切なオフセット量で順次加算され、異なる画素のみが保持され、結果としてフレームサイズが異なり、サムネイルに支障をきたすことが明らかになった.
    PHPのImagickモジュールでGIFアニメーションのサムネイルを完璧に実現する方法を見てみましょう.
  •  

  • $image = new Imagick('old.gif');  
  •  

  • $image = $image->coalesceImages();  
  •  

  • foreach ($image as $frame) {  
  •     $frame->thumbnailImage(50, 50);  

  • }  
  •  

  • $image = $image->optimizeImageLayers();  
  •  

  • $image->writeImages('new.gif', true);  
  •  

  • ?> 
    コードの中で最も重要なのはcoalesceimages方法で、それは各フレームのサイズが一致することを確保して、マニュアルの中で言えば:
      Composites a set of images while respecting any page offsets and disposal methods. GIF, MIFF, and MNG animation sequences typically start with an image background and each subsequent image varies in size and offset. Returns a new Imagick object where each image in the sequence is the same size as the first and composited with the next image in the sequence.
    同時にoptimizeImageLayersメソッドに注意してください.重複画素の内容を削除します.マニュアルで言えば、次のようになります.
      Compares each image the GIF disposed forms of the previous image in the sequence. From this it attempts to select the smallest cropped image to replace each frame, while preserving the results of the animation.
    BTW:より完璧に要求される場合はquantizeImages法を用いてさらに圧縮することができる.
    注意:coalesceimagesでもoptimizeImageLayersでも、新しいImagickオブジェクトが返されます.
    shellの操作に慣れている場合は、GIFアニメーションのサムネイルを実現できます.
    shell> convert old.gif -coalesce -thumbnail 50x50 -layers optimize new.gif 
    詳細な問題があります.convertバージョンはphpバージョンよりも小さくなります.これはAPIの実装が一致していないためです.
    また、サムネイルサイズが原図のスケールに合わない場合は、変形を避けるために裁断や補白も考えなければなりませんが、ここでは主にGIFアニメーションのサムネイルの特殊性について議論するので、これらの問題を議論し続けないで、興味のある自分で解決しましょう.