Miluji zábavné animované GIFy. Narozdíl od zábavných videí do nich autoři nemůžou dát svou oblíbenou písničku, nedávají do nich intro a titulky (zatím) a nemusíte se obtěžovat tím, abyste si „video“ spustili znova. Pokud budete vyvíjet galerii, neberte GIFům pohyb.
Při jakékoliv manipulaci s animovaným GIFem bohužel dojde k tomu, že už nebude animovaný. Jde vlastně o vícevrstvý obrázek a je nutné s ním podle toho nakládat. Dá se to vyřešit dvěmi způsoby – první je použití programu convert v Linuxu, kterému pošleme argumenty skrze funkci system. To ale téměř nikde není reálné, protože snad všechny hostingy to z pochopitelných důvodů blokují. Proto je nutné jít druhou metodou – rozdělit GIF na jednotlivé obrázky, zpracovat je (tzn. otočit, zmenšit, vložit vodoznak) a složit zpátky na GIF.
Prvním krokem je detekce, zda je obrázek animovaný GIF. Tuto funkci jsem našel v komentářích dokumentace PHP.
/**
* Ověří, zda je obrázek animovaný.
* @url http://it.php.net/manual/en/function.imagecreatefromgif.php#59787
*/
function is_animated($filename) {
$filecontents=file_get_contents($filename);
$str_loc=0;
$count=0;
while($count < 2) {
$where1 = strpos($filecontents,"\x00\x21\xF9\x04", $str_loc);
if($where1 === FALSE) {
break;
} else {
$str_loc = $where1 + 1;
$where2=strpos($filecontents,"\x00\x2C", $str_loc);
if($where2 === FALSE) {
break;
} else {
if($where1 + 8 == $where2) {
$count++;
}
$str_loc = $where2 + 1;
}
}
}
return $count > 1;
}
Dalším krokem je rozdělení snímků GIFu na jednotlivé obrázky, úprava a následné sloučení. Lze toho docílit třeba pomocí knihovny gifsplit a gifmerge.
// Vytvoření instance GIFDecoderu (přijímá název GIFu a jeho velikost)
$decoder = new GIFDecoder(file_get_contents(
$_FILES['soubor']['tmp_name']), $_FILES['soubor']['size']
);
// Pole na zpracované snímky a jednotlivé časy prodlev mezi nimi
$frames = array();
$delays = array();
// Projdeme postupně všechny snímky
foreach($decoder->GIFGetFrames() as $frame) {
// Zpracování jako běžný obrázek
$image = imagecreatefromstring($frame);
// Necháme vypsat obrázek a zachytíme jeho data do řetězce
ob_start();
$frames[] = ob_get_clean();
$delays[] = 5;
}
// Sloučíme obrázky zpět do GIFu (pole s daty obrázků, prodlevy)
$encoder = new GIFEncoder(
$frames, $delays,
0, 2, 0, 0, 0,
'bin'
);
// Uložíme obrázek
file_put_contents($encoder->GetAnimation(), "název obrázku.gif");
Jde o relativně náročný proces, který může potřebovat docela dost paměti i času. Pokud si ale pohyblivé GIFy vůbec nepřejeme, můžeme použít alespoň první funkci k informování uživatele o tom, že animované GIFy nejsou povoleny.

Žádné komentáře