アニメーションを破壊せずにアニメーション GIF ファイルのサイズを変更する必要があります。
PHPを使用してどのようにそれを行うことができますか?
アニメーションを破壊せずにアニメーション GIF ファイルのサイズを変更する必要があります。
PHPを使用してどのようにそれを行うことができますか?
imagemagick にアクセスできる場合は、次の操作を実行できます。
system("convert big.gif -coalesce coalesce.gif");
system("convert -size 200x100 coalesce.gif -resize 200x10 small.gif");
system() アクセス権がない場合、これは imagemagick プラグインで可能です。
注:これにより、画像の本質的に最適化されていない合体により、サイズが小さくてもファイルサイズが大きくなる場合があります。
更新: ImageMagick にアクセスできない場合は、次の手順を組み合わせてアニメーション gif のサイズを変更できます (GD アクセスがあると仮定します)。
これは間違いなく ImageMagick ルートよりもはるかに集中的ですが、技術的には可能です。
うまくいったら、世界と共有してください!
gif をフレームに分解し、サムネイルを作成して再組み立てする必要があります。
ImageMagickとこのチュートリアルをご覧ください。
Imagick PHP モジュールを使用してアニメーション GIF のサイズを変更する例を数多く試しましたが、どれもうまくいきませんでした。$animation->writeImage($file_dst);その後、いくつか
のデバッグ時間の後、ついに実際の問題を発見しました。$animation->writeImages($file_dst, true);
に変更したところ
file_put_contents($file_dst, $animation->getImagesBlob());
、ほとんどの例がすぐに機能し始めました。
それが誰かを助けることを願っています。
http://www.php.net/manual/en/imagick.coalesceimages.phpの例では、フレームのタイミングを維持しながら gif のサイズを変更します。他のほとんどの例では行わないこと。
他の例では gif を再構築しますが、この例では画像のフレームを変更できます。
ImageMagick がインストールされている場合は、次の単一の呼び出しを使用できますconvert。
system("convert big.gif -coalesce -repage 0x0 -resize 200x100 -layers Optimize small.gif");
これは袋に入っていると思います。
このソリューションは決して完璧ではなく、あちこちに力ずくの攻撃が含まれていますが、アニメーションをサポートするのに十分な機能を備えた 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 ファイルが見つかりましたが、何らかの理由でフレームのサイズが異なり、アニメーションが正しく機能しませんでした。その後、まだデバッグが必要です。
サーバーにImagemagickがない場合は、これを試してみてください。
http://www.phpclasses.org/package/7353-PHP-Resize-animations-in-files-of-the-GIF-format.html
このクラスでは、GDを使用してGIFアニメーションのサイズを変更しています。最初にフレームを解析し、次にサイズを変更します。その後、遅延時間、廃棄方法、カラーテーブルなどを失うことなく、フレームを1つのファイルに再度コンパイルします。
バグを見つけたり、最適化などを提案したい場合は、クラスのフォーラムを使用するか、私のWebサイトのページにコメントを残してください。そして、私はできるだけ早くそれに答えます。
GIF Animation Resizerは、このトリックを実行する単純な 1 クラスのツールです。
注:一時フォルダーを使用して、個別のフレームを書き出します。フレームにタイムスタンプが付けられますが、複数のユーザーが同時に GIF のサイズを変更するサーバーでこれを使用する場合は、一意のフォルダーを作成する必要がある場合があります。
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 関数のコメントを外して、それらのフォルダーで作業が行われることを確認します。必要ではありませんが、機能を確認するために使用します。
これは、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 があるため、ほとんどのサーバーにもあると思います。