Мне нужно изменить размер анимированного GIF-файла, не разрушая анимацию.Изменение размера анимированного GIF-файла без уничтожения анимации
Как это сделать с помощью PHP?
Мне нужно изменить размер анимированного GIF-файла, не разрушая анимацию.Изменение размера анимированного GIF-файла без уничтожения анимации
Как это сделать с помощью PHP?
если у вас есть доступ к ImageMagick, вы можете сделать это:
system("convert big.gif -coalesce coalesce.gif");
system("convert -size 200x100 coalesce.gif -resize 200x10 small.gif");
это, скорее всего, возможно, с ImageMagick плагин, если вы этого не сделаете имеют системный() доступ
ПРИМЕЧАНИЕ: это может создать больший размер файла, хотя изображение меньших размеров связано с объединением, по существу, деоптимизирующего изображение.
UPDATE: Если у вас нет доступа ImageMagick, вы должны быть в состоянии использовать комбинацию из следующих шагов, чтобы изменить размер анимированного GIF (если у вас есть доступ GD):
Это, безусловно, гораздо более интенсивным, чем маршрут ImageMagick, но это должно быть технически возможно.
Если вы его работаете, пожалуйста, поделитесь с миром!
Вам нужно разложить gif на фреймы, уменьшить эскиз и снова собрать.
Посмотрите ImageMagick: http://php.net/imagick и этот учебник: http://www.phpro.org/examples/Thumbnail-From-Animated-GIF.html
просто Creat 3 Имя папки 1.frame_output 2.images 3.resized_frame_output и скачать 2 кодер и декодер класса от этого ниже ссылку класса 1.Download «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 для загрузки. & Let Enjoy the script.
..save этого скрипта как ..... 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>";
}
?>
................. ...... LETS ENJOY ............
uncomment функция usleep, чтобы увидеть, как работа происходит в этих папках. Не обязательно, но я использую ее, чтобы увидеть функциональность.
Это не работает с кадрами с прозрачностью в нем. – FidoBoy
Я думаю, что у меня это есть в сумке.
Это решение отнюдь не идеально и содержит некоторые грубые силы здесь и там, но я смог добавить свой сценарий изменения размера изображения на основе GD/PHP с достаточной функциональностью для поддержки анимации.
решение в значительной степени основывается на отличных бесплатных библиотек Ласло Zsidi - http://www.phpclasses.org/browse/author/283569.html
Вы можете проверить быстрый демо и скачать исходники из http://forssto.com/gifexample/ (прямая ссылка: http://forssto.com/gifexample/gifanimresize.zip)
Известные проблемы:
поддержка прозрачности - это было бы легко добавить к этому решению, но как я не ВГА e немедленно необходимо для это, я останавливаюсь здесь.
Частота кадров - по неизвестной причине класс GifEncoder не принимает во внимание ставки кадров, указанных. Мне нужно будет посмотреть в это позже.
Я нашел один GIF-файл из моего набора тестов, которые так или иначе имели различные размера кадра в нем и что анимация не удалось корректно работать. Все еще некоторая отладка для этого.
Здравствуйте. Благодарю. Я попробовал ваше решение. Я изменил источники, чтобы прочитать изображение из строки (дайте мне знать, если вам интересно), но оказалось, что WAAAY замедляется. Наконец я понял, что Imagick был доступен на хостинге и использовал это вместо этого. – Rolf
Все ответы, кроме корыта ImageMagick, не работают для меня. Скрипты в ответах до этого полны ошибок.
Даже установка ImageMagick была сложной задачей, так что вот мой опыт.
Здесь how to install ImageMagick на окнах 7 и xampp 1.7.4.
Примечание: Выберите 64 бит (для win7) и установите флажок «Добавить в системный путь».
А затем следуют: http://www.creativearmory.com/tutorials/resize-animated-gifs-with-php-and-imagemagick
Я потерял часы на скриптах в этой должности, и ImageMagick и этот учебник был sucessfull в течение нескольких минут.
И еще одно примечание: у моего веб-сервера по умолчанию есть ImageMagick, поэтому я думаю, что на большинстве серверов есть он тоже.
Пример на http://www.php.net/manual/en/imagick.coalesceimages.php изменит размер вашего gif, сохраняя при этом время вашей рамки. Что-то большинство других примеров не делают.
Другие примеры перестраивать МФП в то время как это один позволяет изменять кадров изображения.
imagick - лучшая при сложных манипуляциях с изображениями. PHP знает несколько трюков. – transilvlad
Это решение, в которое я пошел, наконец, я попробовал другие решения, но они были слишком медленными. Удостоверьтесь, что у вас есть Imagick на вашем хостинге (сейчас это не так уж редко) и используйте это. – Rolf
Если вы не имеете ImageMagick на сервере вы можете попробовать это:
http://www.phpclasses.org/package/7353-PHP-Resize-animations-in-files-of-the-GIF-format.html
Класс изменения размера GIF анимации с GD.Сначала анализирует кадры, а затем изменяет их размеры, после чего он компилирует их снова в один файл без потери времени задержки, методов удаления, таблиц цветов и т. Д.
Попробуйте, если вы обнаружите ошибку или хотите предложить некоторые оптимизации и т. Д. вы можете использовать форум класса или оставить комментарий на странице на моем сайте. И я отвечу на это как можно скорее.
Я пробовал множество примеров изменения размера анимированных GIF-файлов с помощью модуля Imagick PHP, но ни один из них не работал для меня. Затем через некоторое время отладки наконец я нашел фактический вопрос: анимация была потеряна при сохранении изображения на диск, с помощью $animation->writeImage($file_dst);
или $animation->writeImages($file_dst, true);
Я изменил его file_put_contents($file_dst, $animation->getImagesBlob());
и большинство примеров начали работать сразу.
Надеюсь, это поможет кому-то.
Попробуйте GDEnhancer (Используйте ImageCraft). Ему нужна только библиотека GD, и она поддерживает gif-анимацию.
Спасибо. Может ли он использоваться с PHP 5.2? На сайте это говорит о 5.4+, что довольно редко для большинства сред (в том числе и моей целевой среды в этом случае). В противном случае отлично выглядит! – Rolf
Увы, сайт GDEnhancer мертв. – TechNyquist
@TechNyquist сейчас GDEnhacer устарел, вместо этого используйте https://github.com/coldume/imagecraft – BredeBS
GIF Animation Resizer - простой инструмент для одного класса, который будет делать трюк.
Примечание: Он использует временную папку для записи отдельных кадров. Хотя это временные метки кадров, вам может понадобиться создать уникальную папку, если вы собираетесь использовать ее на сервере, где несколько пользователей будут изменять размер GIF одновременно.
Если у вас есть ImageMagick установлен, то вы можете использовать один вызов convert
:
system("convert big.gif -coalesce -repage 0x0 -resize 200x100 -layers Optimize small.gif");
Imagecraft является надежным библиотека PHP GD и расширения, поддерживает GIF анимацию, редактировать и создавать изображения в несколько слоев и поддерживает водяной знак ,
Я использовал эту функцию:
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);
}
извините, у меня нет доступа на imagemagic. Любое другое решение? – riad
Добавлено обновление с помощью нескольких шагов с использованием классов GD и сторонних разработчиков, чтобы это произошло (теоретически). –
Я думаю, что я получил теорию о работе на практике: http://forssto.com/gifexample/ –