47

アニメーションを破壊せずにアニメーション GIF ファイルのサイズを変更する必要があります。

PHPを使用してどのようにそれを行うことができますか?

4

13 に答える 13

65

imagemagick にアクセスできる場合は、次の操作を実行できます。

system("convert big.gif -coalesce coalesce.gif");
system("convert -size 200x100 coalesce.gif -resize 200x10 small.gif");

system() アクセス権がない場合、これは imagemagick プラグインで可能です。

注:これにより、画像の本質的に最適化されていない合体により、サイズが小さくてもファイルサイズが大きくなる場合があります。

更新: ImageMagick にアクセスできない場合は、次の手順を組み合わせてアニメーション gif のサイズを変更できます (GD アクセスがあると仮定します)。

  1. 画像がアニメーション gif かどうかを検出する: php と gd を使用してアニメーション gif を検出できますか? (トップアンサー)
  2. アニメーション GIF を個々のフレームに分割します: http://www.phpclasses.org/package/3234-PHP-Split-GIF-animations-into-multiple-images.html
  3. 個々のフレームのサイズを変更します: http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
  4. フレームを再度アニメーション GIF に再合成します: http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

これは間違いなく ImageMagick ルートよりもはるかに集中的ですが、技術的には可能です。

うまくいったら、世界と共有してください!

于 2009-04-05T07:09:13.897 に答える
11

gif をフレームに分解し、サムネイルを作成して再組み立てする必要があります。

ImageMagickこのチュートリアルをご覧ください。

于 2009-04-05T07:08:20.373 に答える
6

Imagick PHP モジュールを使用してアニメーション GIF のサイズを変更する例を数多く試しましたが、どれもうまくいきませんでした。$animation->writeImage($file_dst);その後、いくつか のデバッグ時間の後、ついに実際の問題を発見しました。$animation->writeImages($file_dst, true);

に変更したところ file_put_contents($file_dst, $animation->getImagesBlob()); 、ほとんどの例がすぐに機能し始めました。

それが誰かを助けることを願っています。

于 2013-03-13T17:55:55.823 に答える
4

http://www.php.net/manual/en/imagick.coalesceimages.phpの例では、フレームのタイミングを維持しながら gif のサイズを変更します。他のほとんどの例では行わないこと。

他の例では gif を再構築しますが、この例では画像のフレームを変更できます。

于 2012-02-22T06:20:41.023 に答える
3

ImageMagick がインストールされている場合は、次の単一の呼び出しを使用できますconvert

system("convert big.gif -coalesce -repage 0x0 -resize 200x100 -layers Optimize small.gif");
于 2015-04-20T13:34:18.417 に答える
2

これは袋に入っていると思います。

このソリューションは決して完璧ではなく、あちこちに力ずくの攻撃が含まれていますが、アニメーションをサポートするのに十分な機能を備えた GD / PHP ベースの画像サイズ変更スクリプトを追加することができました。

このソリューションは、László Zsidi による優れたフリーウェア ライブラリに大きく基づいています - http://www.phpclasses.org/browse/author/283569.html

簡単なデモを確認して、 http: //forssto.com/gifexample/ (直接リンク: http://forssto.com/gifexample/gifanimresize.zip )からソースをダウンロードできます。

既知の問題点:

  • 透明性のサポート - これはこのソリューションに簡単に追加できますが、すぐに必要なわけではないので、ここで終了します。

  • フレーム レート - 不明な理由により、GifEncoder クラスは指定されたフレーム レートを考慮できません。これについては後で調べる必要があります。

  • テストのセットから 1 つの gif ファイルが見つかりましたが、何らかの理由でフレームのサイズが異なり、アニメーションが正しく機能しませんでした。その後、まだデバッグが必要です。

于 2011-03-22T13:52:07.777 に答える
1

サーバーにImagemagickがない場合は、これを試してみてください。

http://www.phpclasses.org/package/7353-PHP-Resize-animations-in-files-of-the-GIF-format.html

このクラスでは、GDを使用してGIFアニメーションのサイズを変更しています。最初にフレームを解析し、次にサイズを変更します。その後、遅延時間、廃棄方法、カラーテーブルなどを失うことなく、フレームを1つのファイルに再度コンパイルします。

バグを見つけたり、最適化などを提案したい場合は、クラスのフォーラムを使用するか、私のWebサイトのページにコメントを残してください。そして、私はできるだけ早くそれに答えます。

于 2012-03-11T18:53:08.350 に答える
1

GIF Animation Resizerは、このトリックを実行する単純な 1 クラスのツールです。

注:一時フォルダーを使用して、個別のフレームを書き出します。フレームにタイムスタンプが付けられますが、複数のユーザーが同時に GIF のサイズを変更するサーバーでこれを使用する場合は、一意のフォルダーを作成する必要がある場合があります。

于 2015-02-27T22:45:48.620 に答える
1

3つのフォルダー名を作成するだけです 1.frame_output 2.images 3.resized_frame_output そして、このリンクの下から2つのエンコーダーとデコーダークラスをダウンロードします 1.http://phpclasses.elib.com/browse/packageからクラス「GIFDecoder.class.php」をダウンロードします/3234.html 2. http://phpclasses.betablue.net/browse/package/3163.html からクラス "GIFEncoder.class.php" をダウンロードします。

次に、スクリプト名を "resize_animator.php" として実行し、アップロード html ファイルを作成して、スクリプトを楽しんでください。

...このスクリプトを .....index.php として保存します.......

<html>
<body>
<table width="500" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form action="resize_animator.php" method="post" enctype="multipart/form-data" >
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td align="center"><font face="Tahoma">SELECT ANIMATED FILE</font> 
<input type="file" name="uploadfile" size="20" accept="image/gif"/>
</td>
</tr>
<tr>
<td align="center"><input type="submit" name="Submit" value="PROCESS ANIMATION" /></td>
</tr>
</table>
</td>
</form>
</tr>
</table>
</body>
</html>

........................保存し、このスクリプトを resize_animator.php として保存します........

   <?php

   require "GIFDecoder.class.php";
   include "GIFEncoder.class.php";
   $file_name= $_FILES['uploadfile']['name'];
   $file_ext = substr($file_name, -4);
   $file_size=($_FILES["uploadfile"]["size"] /1024 );
   if($file_ext=='.gif')
    {
 if($file_size > 0 && $file_size < 2000 )
  {
    session_start ( );
        $uploaded_file = $_FILES['uploadfile']['tmp_name'];
        $fp=file_get_contents($uploaded_file);

        if ( $fp )
            {
                $_SESSION['delays'] = Array ( );
                $gif = new GIFDecoder ( $fp );
                $arr = $gif->GIFGetFrames ( );
                $_SESSION [ 'delays' ] = $gif -> GIFGetDelays ( );

                for ( $i = 0; $i < count ( $arr ); $i++ )
                {
                        fwrite ( fopen ( ( $i < 10 ? "frame_output/$i$i_frame.gif" : "frame_output/$i_frame.gif" ), "wb" ), $arr [ $i ] );
                }
          }

        function resize_frames($newwidth,$newheight)
            {
                    $dir=opendir("frame_output/");
                    $i=0;
                    while($imgfile=readdir($dir))
                    {
                         if ($imgfile != "." && $imgfile!="..")
                             {
                                        $imgarray[$i]=$imgfile;
                                        $uploadedfile = "frame_output/".$imgarray[$i];
                                        $src = imagecreatefromgif($uploadedfile);
                                        list($width,$height)=getimagesize($uploadedfile);
                                        $tmp=imagecreatetruecolor($newwidth,$newheight);
                                        imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);
                                        $filename = "resized_frame_output/".$imgarray[$i];
                                        imagegif($tmp,$filename,100);
                                        imagedestroy($src);
                                        imagedestroy($tmp);
                                        $i++;
                            }
                    }
                    closedir($dir);

                if ( $dh = opendir ( "resized_frame_output/" ) )
                {
                    while ( false !== ( $dat = readdir ( $dh ) ) )
                    {
                        if ( $dat != "." && $dat != ".." )
                        {
                            $frames [ ] = "resized_frame_output/$dat";
                        }
                    }
                    closedir ( $dh );
                }

            $gif = new GIFEncoder   ( $frames,$_SESSION [ 'delays' ],0, 2, 0, 0, 0,"url" );
            $data = $gif->GetAnimation ( );

            $x='x';
            $y='_';
            $uploaded_file_name= $_FILES['uploadfile']['name'];
            $actual_file_name = substr($uploaded_file_name, 0, -4);
            $file_extention = substr($uploaded_file_name, -4);
            $new_name=$actual_file_name.$y.$newwidth.$x.$newheight.$file_extention ;

            //$output_image_name=$newwidth.$x.$newheight;
            fwrite ( fopen ( "images/$new_name", "wb" ), $data );
            //remove resized frames from folder
            //sleep for 1 second
            // usleep(2000000);
            $dir = 'resized_frame_output/';
            foreach(glob($dir.'*.*') as $v)
                {
                 unlink($v);
                }
        }  // end of function resize_frames


            $gif = new GIFEncoder   ( $frames,$_SESSION [ 'delays' ],0, 2, 0, 0, 0,"url" );
            $data = $gif->GetAnimation ( );

            $x='x';
            $y='_';
            $z='_p';
            $uploaded_file_name= $_FILES['uploadfile']['name'];
            $actual_file_name = substr($uploaded_file_name, 0, -4);
            $file_extention = substr($uploaded_file_name, -4);
            $new_name=$actual_file_name.$y.$newwidth.$x.$newheight.$z.$file_extention ;

            //$output_image_name=$newwidth.$x.$newheight;
            fwrite ( fopen ( "images/$new_name", "wb" ), $data );
            //remove resized frames from folder
            //sleep for 1 second
             //usleep(2000000);
            $dir = 'resized_frame_output/';
            foreach(glob($dir.'*.*') as $v)
                {
                 unlink($v);
                }
        }  // end of function resize_frames

            resize_frames(110,110);
            resize_frames(120,160);
            resize_frames(120,80);
            resize_frames(128,96);
            resize_frames(128,128);
            resize_frames(208,208);
            resize_frames(208,320);

            session_destroy();

            //usleep(200000);

            //remove resized frames from folder
            $dir = 'frame_output/';
            foreach(glob($dir.'*.*') as $v)
                {
                 unlink($v);
                }
      echo "<center><h1>Your Animation processing is compleated.</h1></center>";
      echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>";
  }  //end of file size checker
else
 {
      echo "<center><h2>You Upload a unfit size image .Upload a file within 2000 KB</h2></center>";
      echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>";
 }
   } //end of file extention checker
  else
  {
   echo "<center><h2>Uplaod a gif file!</h2></center>";
   echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>";
  }
  ?>

.......................楽しもう............

usleep 関数のコメントを外して、それらのフォルダーで作業が行われることを確認します。必要ではありませんが、機能を確認するために使用します。

于 2009-04-07T10:35:00.297 に答える
1

これは、ImageMagick がうまくいかなかったことを除いて、すべての答えです。これより前の回答のスクリプトはすべてエラーでいっぱいです。

ImageMagick をインストールすることさえ難しかったので、これが私の経験です。

Windows 7 と xampp 1.7.4 にImageMagick をインストールする方法は次のとおりです。
:64ビット(win7の場合)を選択し、インストール時に「システムパスに追加」オプションをチェックしたままにします。

そして、以下に従ってください: http://www.creativearmory.com/tutorials/resize-animated-gifs-with-php-and-imagemagick

この投稿のスクリプトで何時間も無駄にしましたが、ImageMagick とこのチュートリアルは数分で成功しました。

もう 1 つ注意: 私の Web サーバーにはデフォルトで ImageMagick があるため、ほとんどのサーバーにもあると思います。

于 2011-09-23T22:00:30.247 に答える