WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [PHP] ImagickによるアニメーションGIFのリサイズがうまくいかない

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

(※この問題はgauさんのおかげで解決しています。せっかちな方は下方の2009/5/29追記を確認してください。)

こちらのサイトなどを参考にアニメーションGIFのリサイズに挑戦しましたがうまくいきません。


$images = new Imagick($source);
$images = $images->coalesceImages();

$width = round($images->getImageWidth() * $scale);
$height = round($images->getImageHeight() * $scale);
do {
$images->scaleImage($width, $height);
} while ($images->nextImage());

$images = $images->deconstructImages();
$images->writeImages($dest, true);
一コマになってしまいます。どうやら一番最後のこまになっている模様。そもそも

$images = new Imagick($source);
$images = $images->coalesceImages();
$images->writeImages($dest, true);
この時点で一コマになってます。

$images = new Imagick($source);
echo $images->getNumberImages();
echo $images->getImageIndex();
してみたところ読み込んだ時点で一番最後のコマにイテレータが移動しています。もしやcoalesceImagesが現在のコマから後ろの物を処理するのか?おっ!これか?と思って

$images = new Imagick($source);
$images->setImageIndex(0);
したら・・・暴走・・・CPU100%のまま帰って来ません。setIteratorIndexというのもあるので試してみたところ「そんなメソッドはありません・・・」のエラー。
どうしようもないのでとりあえず今回は

$source = '578.gif';
$dest = 'dest.gif';
$scale = 50;

exec('convert '.$source.' -coalesce -scale '.$scale.'% -deconstruct '.$dest);
execでコマンドをたたいて実行しようと思います。
PHP5.1.6
ImageMagick6.2.8
Imagick2.2.1
です。恐らくバージョンの問題でしょうか。そもそも最初にImagick2.2.2を入れたのですがこちらのサイトにある問題と同じ問題がおきてダウングレードしました。サーバーも自社管理ならもっと色々試せるのでしょうがこの辺でギブアップします。

何か情報ありましたらコメントお願いします。

※2009/5/29追記
gauさんにコメントを頂き解決いたしました。ありがとうございます。
やっぱりcoalesceImagesもdeconstructImagesも今いるフレームから後ろに処理をするようです。で、最初のフレームに設定するコマンドがsetFirstIteratorです。

$image = new Imagick($source);
$image->setFirstIterator();
$image = $image->coalesceImages();

$width = round($image->getImageWidth() * $scale);
$height = round($image->getImageHeight() * $scale);

do {
$image->scaleImage($width, $height);
} while ($image->nextImage());

$image->setFirstIterator();

$image = $image->deconstructImages();
$image->writeImages($dest, true);
しかし、めっぽう重いです。特にcoalesceImagesとdeconstructImagesが内部で一回ずつループして全画像に処理するので重いと思われます。gauさんのエントリーにあるやり方の方がループが一回だし断然早かった。また、gauさんの所では携帯に対応させる情報なんかもあります。そちらを参照してください。
スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。