ホームページ >php教程 >php手册 >GIFアニメーションサムネイルを完全に実装するPHPコード

GIFアニメーションサムネイルを完全に実装するPHPコード

WBOY
WBOYオリジナル
2016-06-13 12:12:231018ブラウズ

以下は、問題を説明するために CS の警察とギャングのゲームから抜粋した GIF アニメーションです。

GIFアニメーション画像:old.gif

問題を明確にするために、まずアニメーションの各フレームを復元します。

オプション 1: PHP で Imagick モジュールを使用します:

コードをコピーします コードは次のとおりです:


< ;?php
$image = new Imagick('old.gif');
$i = 0;
foreach ($image として $frame) {
$frame->writeImage(' old_' . $ i . '.gif');
}
?>


オプション 2: ImageMagick が提供する変換コマンドを使用します。 >
コードをコピー

コードは次のとおりです: shell>convert old.gif old_%d.gif



GIF アニメーションの各フレームの結果の概略図は次のとおりです:

GIFアニメーションの各フレームのイラスト

GIF アニメーションを圧縮するために、最初のフレームがテンプレートとして使用され、残りのフレームが適切なオフセットに従って順番に蓄積され、異なるピクセルのみが保持されることが明確にわかります。その結果、各フレームのサイズが異なり、サムネイルに障害が発生します。

PHP で Imagick モジュールを使用して GIF アニメーション サムネイルを完全に実装する方法を見てみましょう:


コードをコピーします

コードは次のとおりです。 $image = new Imagick('old.gif');

$image = $image->coalesceImages(); $frame としての画像) {
$frame->thumbnailImage(50, 50);
$image = $image->optimizeImageLayers(); 'new.gif'、true);




コード内で最も重要なのは、各フレームのサイズが一貫していることを保証する coalesceimages メソッドです。マニュアルの言葉では次のようになります。


GIF、MIFF、および MNG アニメーション シーケンスは通常、画像の背景から始まり、後続の各画像のサイズとオフセットが異なる新しい Imagick オブジェクトを返します。シーケンスは最初の画像と同じサイズで、シーケンス内の次の画像と合成されます。


同時に、重複したピクセル コンテンツを削除する optimizeImageLayers メソッドにも注意してください。

アニメーションの結果を維持しながら、GIF が配置したシーケンス内の前の画像の各画像を比較して、各フレームを置き換える最小のトリミング画像を選択しようとします。

ところで: より完璧な表現が必要な場合は、quantizeImages メソッドを使用してさらに圧縮できます。

注: coalesceimages であっても、optimizeImageLayers であっても、新しい Imagick オブジェクトが返されます。

シェルの操作に慣れている場合は、次のように GIF アニメーションのサムネイルを実装できます:

コードをコピー

コードは次のとおりです:


shell> 変換 old.gif -coalesce -thumbnail 50x50 -layers optimize new.gif

生成された new.gif は次のとおりです:




新しい.gif

詳細な問題があります。変換バージョンは php バージョンよりも小さくなります。これは、一貫性のない API 実装が原因です。

また、サムネイルのサイズが元の画像の比率と一致しない場合、変形を避けるためにトリミングやパディングを考慮する必要があります。この記事では主に GIF アニメーションのサムネイルの特殊性について説明しますので、説明しません。これらの問題について議論を続けてください。興味があるなら、自分でやってみてください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。