3

私はアニメーションgifをトリミングしようとしていましたが、出力では同じサイズの画像を取得していますが、トリミングされています.

たくさんの空きスペースがキャンバスで埋め尽くされています。

たとえば、私は 600x100 のアニメーション GIF を持っていましたが、100x100 のトリミングを要求しました。

誰かがこの問題の解決策を知っていますか?

$gif = new Imagick($s['src']);

foreach($gif as $frame){
  $frame->cropImage($s['params']['w'], $s['params']['h'], $s['params']['x'], $s['params']['y']);            
}   

$gif->writeImages($s['dest_path'] .'/'. $fullname,true);
4

2 に答える 2

6

私はあなたと同じ問題を抱えていました.coalesceimages関数を使用することが解決策であることがわかりました。

これは、Imagick を使用して php でアニメーション gif を切り取り、サイズ変更する実際の例です。

<?php
// $width and $height are the "big image"'s proportions
if($width > $height) {
    $x     = ceil(($width - $height) / 2 );
    $width = $height;
} elseif($height > $width) {
    $y      = ceil(($height - $width) / 2);
    $height = $width;
}

$image = new Imagick(HERE_YOU_PUT_BIG_IMAGE_PATH);
$image = $image->coalesceImages(); // the trick!
foreach ($image as $frame) {
    $frame->cropImage($width, $height, $x, $y); // You crop the big image first
    $frame->setImagePage(0, 0, 0, 0); // Remove canvas
}
$image = $image->coalesceImages(); // We do coalesceimages again because now we need to resize
foreach ($image as $frame) {
    $frame->resizeImage($newWidth, $newHeight,Imagick::FILTER_LANCZOS,1); // $newWidth and $newHeight are the proportions for the new image
}
$image->writeImages(CROPPED_AND_RESIZED_IMAGE_PATH_HERE, true);
?>

上記のコードは、同じ高さのサムネイルを生成するために使用されています。好きなように変更することもできます。

$frame->cropImage($width, $height, $x, $y); を使用する場合に注意してください。必要な値をそこに置く必要があります。

IE $frame->cropImage($s['params']['w'], $s['params']['h'], $s['params']['x'], $s[' params']['y']);

もちろん、トリミングやサイズ変更の代わりにトリミングしたい場合は、次のようにできます。

$image = new Imagick(HERE_YOU_PUT_BIG_IMAGE_PATH);
$image = $image->coalesceImages(); // the trick!
foreach ($image as $frame) {
    $frame->cropImage($s['params']['w'], $s['params']['h'], $s['params']['x'], $s['params']['y']);
    $frame->setImagePage(0, 0, 0, 0); // Remove canvas
}

それが役に立てば幸い!

Ps: 私の英語でごめんなさい :)

于 2010-10-21T14:50:50.610 に答える
5

多くの場合、ImageMagick には、背景レイヤーのような「ページ」または作業領域があります。画像をトリミングした後、これが残っているようです(以前、コマンドラインツールを使用して合成とサイズ変更の動作を理解するのに混乱した時間がありました...)。

cropImageの PHP マニュアル ページをチェックアウトすると、次のコメントが表示されました。

Christian Dehning - 09-Apr-2010 10:57
gif 画像 (私は jpg および png 画像で問題はありませんでした) をトリミングすると、キャンバスが削除されません。トリミングされた gif に対して次のコマンドを実行して、空白のスペースを削除してください。

$im->setImagePage(0, 0, 0, 0);
于 2010-10-17T06:47:32.930 に答える