Измените размер анимированного файла GIF, не уничтожая анимацию

Вот один интересный подход. Скажите, что ваш список называется any_number_list. Затем Вы можете использовать следующий синтаксис:

sequence = [y - x for x, y in zip(any_number_list[:-1], any_number_list[1:]) if y - x < 0] 
if not sequence:
    print("Each element is greater than the previous one")

Вы упаковываете два массива, используя zip, и перебираете их, добавляя разницу к новому массиву с именем sequence, если разница меньше 0. Если в конце этот массив содержит любое число, то это не монотонно не падающая последовательность.

45
задан Alexis Wilke 10 February 2015 в 02:06
поделиться

3 ответа

если у Вас есть imagemagick доступ, можно сделать это:

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

это наиболее вероятно с imagemagick плагином, если у Вас нет системы () доступом

Примечание: это может создать больший размер файла, хотя меньшие размеры отображают из-за объединения по существу deoptimizing изображение.

ОБНОВЛЕНИЕ: Если у Вас нет доступа ImageMagick, необходимо смочь использовать комбинацию следующих шагов для изменения размеров анимированного gif (предполагающий, что у Вас есть доступ GD):

  1. Обнаружьте, если изображение является анимированным gif: я могу обнаружить анимированный gifs, использующий php и gd? (главный ответ)
  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
ответ дан Community 26 November 2019 в 21:08
поделиться

просто создайте 3 имени папки 1.frame_output 2.images 3.resized_frame_output и загрузите 2 класса кодера и декодера с этой ссылки ниже 1. Загрузите класс "GIFDecoder.class.php" с http://phpclasses.elib.com/browse/package/3234.html 2. Загрузите класс "GIFEncoder.class.php" с http://phpclasses.betablue.net/browse/package/3163.html

и затем выполненный название сценария как "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, чтобы видеть, что работа происходит в те folders.its, не необходимые, но я использую ее для наблюдения функциональности.

1
ответ дан riad 26 November 2019 в 21:08
поделиться

Необходимо было бы разложить gif на кадры, миниатюру и повторно собраться.

Взгляните на ImageMagick и это учебное руководство.

11
ответ дан Abela 26 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: