我需要在不破坏动画的情况下调整动画GIF文件的大小。
我怎样才能使用PHP?
答案 0 :(得分:58)
如果您有imagemagick访问权限,则可以执行以下操作:
system("convert big.gif -coalesce coalesce.gif");
system("convert -size 200x100 coalesce.gif -resize 200x10 small.gif");
如果您没有system()访问权限,则很可能使用imagemagick插件
注意:这可能会创建一个更大的文件大小,但较小的尺寸图像会因为合并而基本上不优化图像。
<强>更新强> 如果您没有ImageMagick访问权限,您应该能够使用以下步骤的组合来调整动画gif的大小(假设您具有GD访问权限):
这肯定比ImageMagick路线更加密集,但它在技术上应该是可行的。
如果你正常工作,请与全世界分享!
答案 1 :(得分:11)
您需要将gif分解为帧,缩略图和重新组合。
答案 2 :(得分:11)
尝试 GDEnhancer (使用ImageCraft)。它只需要GD库,它保持gif动画
答案 3 :(得分:4)
http://www.php.net/manual/en/imagick.coalesceimages.php上的示例会调整gif的大小,同时保留帧时间。大多数其他例子都没有。
其他示例重建 gif,而这个允许您修改图像的帧。
答案 4 :(得分:4)
我尝试过使用Imagick PHP模块调整动画GIF大小的大量示例,但它们都不适用于我。
然后经过一些调试时间后,我发现了实际问题:动画在将图像保存到磁盘后丢失,$animation->writeImage($file_dst);
或
$animation->writeImages($file_dst, true);
我把它改成了
file_put_contents($file_dst, $animation->getImagesBlob());
大多数例子都是立即开始工作的。
希望它有所帮助。
答案 5 :(得分:3)
如果您安装了ImageMagick,则可以使用convert
的单个电话:
system("convert big.gif -coalesce -repage 0x0 -resize 200x100 -layers Optimize small.gif");
答案 6 :(得分: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类无法使用 考虑到帧率 指定。我需要调查一下 这个稍后。
我确实从我的套装中找到了一个gif文件 以某种方式有所不同的测试 大小的帧和动画 无法正常工作。还是一些 然后调试。
答案 7 :(得分:1)
只需创建3个文件夹名称1.frame_output 2.images 3.resized_frame_output并从以下链接下载2个编码器和解码器类 1.从http://phpclasses.elib.com/browse/package/3234.html下载课程“GIFDecoder.class.php” 2.从http://phpclasses.betablue.net/browse/package/3163.html
下载课程“GIFEncoder.class.php”然后将脚本名称运行为“resize_animator.php”,创建一个上传html文件&amp;让我们享受剧本。
..将此脚本保存为..... 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功能,看看工作是否发生在那些文件夹中。没有必要,但我用它来查看功能。
答案 8 :(得分:1)
除了ImageMagick之外的所有答案都没有为我工作。在此之前的答案中的脚本都充满了错误。
即使安装ImageMagick也很难管理,所以这是我的经验。
这是Windows 7和xampp 1.7.4上的how to install ImageMagick 注意:选择64位(对于win7),并在安装时选中“添加到系统路径”选项。
然后按照: http://www.creativearmory.com/tutorials/resize-animated-gifs-with-php-and-imagemagick
我在这篇文章中丢失了几个小时的脚本,ImageMagick和本教程在几分钟内就成功了。
还有一点需要注意:默认情况下我的网络服务器有ImageMagick,所以我猜大多数服务器也都有。
答案 9 :(得分:1)
如果你的服务器中没有Imagemagick,你可能想试试这个:
http://www.phpclasses.org/package/7353-PHP-Resize-animations-in-files-of-the-GIF-format.html
该课程正在使用GD调整GIF动画的大小。首先解析帧,然后调整它们的大小,然后再将它们编译成单个文件,而不会丢失延迟时间,处理方法,颜色表等。
尝试如果您发现错误或想要建议一些优化等,您可以使用课程论坛或在我的网站页面上留言。我会尽快回答。
答案 10 :(得分:1)
GIF Animation Resizer是一个简单的一流工具,可以解决问题。
注意:它使用临时文件夹写出单独的框架。虽然它为帧添加时间戳,但如果您打算在多个用户同时调整GIF大小的服务器上使用它,则可能需要创建一个唯一的文件夹。
答案 11 :(得分:0)
Imagecraft是一个可靠的PHP GD库和扩展,可以保持GIF动画,编辑和组合多层图像并支持水印。
答案 12 :(得分:0)
我使用了这个功能:
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);
}