web-dev-qa-db-ja.com

アニメーションを破壊せずにアニメーションGIFファイルのサイズを変更する

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

PHPを使用してどうすればよいですか?

45
riad

imagemagickにアクセスできる場合、これを行うことができます。

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

system()アクセス権を持っていない場合、これはおそらくimagemagickプラグインで可能です。

注:本質的に画像の最適化を解除するため、サイズの小さい画像でもファイルサイズが大きくなる場合があります。

UPDATE: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ルートよりも間違いなくはるかに集中的ですが、技術的には可能です。

動作するようになったら、世界と共有してください!

58
Jeremy Stanley

試してみる GDEnhancer ( ImageCraft を使用します)。 Gdライブラリのみが必要で、gifアニメーションを保持します

11
nut

Gifをフレームに分解し、サムネイルを作成し、再構築する必要があります。

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

11
cherouvim

Imagick PHPモジュールを使用してアニメーションGIFのサイズを変更する多くの例を試してみましたが、どれも機能しませんでした。 $animation->writeImage($file_dst);または$animation->writeImages($file_dst, true);によるディスクへのイメージ

私はそれをfile_put_contents($file_dst, $animation->getImagesBlob());に変更し、ほとんどの例はすぐに動作し始めました。

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

5
Antony Harder

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

他の例rebuildGIFを使用すると、フレームをmodifyできます画像の。

4
Matt Crossley

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

system("convert big.gif -coalesce -repage 0x0 -resize 200x100 -layers Optimize small.gif");
3
Alec Jacobson

これをバッグに入れたと思う。

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

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

クイックデモをチェックアウトし、ソースを http://forssto.com/gifexample/ (直接リンク: http://forssto.com/gifexample/gifanimresize.Zipからダウンロードできます。

既知の問題点:

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

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

  • 私のテストセットから、何らかのサイズのフレームが含まれていて、アニメーションが正しく機能しなかったgifファイルを見つけました。まだいくつかのデバッグが必要です。

2

3つのフォルダ名を作成する1.frame_output 2.images 3.resized_frame_outputと、以下のリンクから2つのエンコーダおよびデコーダクラスをダウンロードする1. http://phpclasses.elib.comからクラス「GIFDecoder.class.php」をダウンロードする/browse/package/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関数のコメントを外して、それらのfolder.itsで発生する作業を確認しますが、機能を確認するためにそれを使用します。

1
riad

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

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

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

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

1
Taha Paksu

これは、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があるため、ほとんどのサーバーにもImageMagickがあります。

1
Sturko

GIF Animation Resizer は、トリックを行うシンプルな1クラスツールです。

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

1
David Harkness

私はこの機能を使用しました:

function gifResize($file_Origin,$file_dest,$percent){       
   $crop_w = 0;
   $crop_h = 0;
   $crop_x = 0;
   $crop_y = 0;
   $image = new Imagick($file_Origin);
   $originalWidth = $image->getImageWidth();
   $originalHeight = $image->getImageHeight();
   $size_w = ($originalWidth*$percent)/100;
   $size_h = ($originalHeight*$percent)/100;
   if(($size_w-$originalWidth)>($size_h-$originalHeight)){
       $s = $size_h/$originalHeight;
       $size_w = round($originalWidth*$s);
       $size_h = round($originalHeight*$s);
   }else{
       $s = $size_w/$originalWidth;
       $size_w = round($originalWidth*$s);
       $size_h = round($originalHeight*$s);
   }       
   $image = $image->coalesceImages();

   foreach ($image as $frame) {
       $frame->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
       $frame->thumbnailImage($size_h, $size_w);
       $frame->setImagePage($size_h, $size_w, 0, 0);
   }
   $imageContent = $image->getImagesBlob();
   $fp = fopen($file_dest,'w');
   fwrite($fp,$imageContent);
   fclose($fp);

}

0
Fernando RIS

Imagecraft は、信頼できるPHP Gdライブラリおよび拡張機能であり、GIFアニメーションを保持し、複数のレイヤーで画像を編集および構成し、透かしをサポートします。

0
Waqas Bukhary