Hi guys,
I need to resize a animated gif file without destroying the animation. Let I have a flower animated file name: flower.gif size is: 700x700, frame no: 5. I need to resize it 128x128 & 240x320 without destroy animation . Each resized animated file must hold same frame number as uploaded animated file.
How can I do it using PHP?
GUYS! please help
ANSWER: I already solve the problem.Please see my answer with detail code below.thx,riad.
-
You'd need to decompose the gif into frames, thumbnail and re-assemble.
Have a look at ImageMagick: http://php.net/imagick and this tutorial: http://www.phpro.org/examples/Thumbnail-From-Animated-GIF.html -
if you have imagemagick access, you can do this:
system("convert big.gif -coalesce coalesce.gif"); system("convert -size 200x100 coalesce.gif -resize 200x10 small.gif");this is most likely possible with the imagemagick plugin if you don't have system() access
NOTE: this may create a larger filesize though a smaller dimensions image due to coalescing essentially deoptimizing the image.
UPDATE: If you don't have ImageMagick access, you should be able to use a combination of the following steps to resize an animated gif (assuming you have GD access):
- Detect if the image is an animated gif: http://stackoverflow.com/questions/280658/can-i-detect-animated-gifs-using-php-and-gd (top answer)
- Split the animated gif into individual frames: http://phpclasses.elib.com/browse/package/3234.html
- Resize the individual frames: http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
- Recomposite the frames into an animated gif again: http://phpclasses.betablue.net/browse/package/3163.html
This is definitely much more intensive than the ImageMagick route, but it should be technically possible.
If you get it working, please share with the world!
riad : sorry, I don't have access on imagemagic. Any other solution?Jeremy Stanley : Posted an update with a number of steps using GD and third party classes to make this happen (in theory). -
just creat 3 folder name 1.frame_output 2.images 3.resized_frame_output and download 2 encoder and decoder class from this below link 1.Download class "GIFDecoder.class.php" from http://phpclasses.elib.com/browse/package/3234.html 2.Download class "GIFEncoder.class.php" from http://phpclasses.betablue.net/browse/package/3163.html
and then run the script name as "resize_animator.php" , creat a upload html file & Let Enjoy the script.
..save this script as .....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>........................save and this script as 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>"; } ?>.......................LETS ENJOY............
uncomment the usleep function to see the work happen into those folders.its not necessary but i use it to see the functionality.
-
Hullo, sir, I am a newbie. Could you possibly reproduce the index.php source here? Thanks.
-
Don't bother. I got it working. Great script. Thanks.
riad : Sorry bro,i was out of net.anyway i fix the both pages.pls have a look and thanks for your thanks
0 comments:
Post a Comment