poner - php print image
¿Puedo detectar gifs animados usando php y gd? (5)
Aquí está la función de trabajo:
/**
* Thanks to ZeBadger for original example, and Davide Gualano for pointing me to it
* Original at http://it.php.net/manual/en/function.imagecreatefromgif.php#59787
**/
function is_animated_gif( $filename )
{
$raw = file_get_contents( $filename );
$offset = 0;
$frames = 0;
while ($frames < 2)
{
$where1 = strpos($raw, "/x00/x21/xF9/x04", $offset);
if ( $where1 === false )
{
break;
}
else
{
$offset = $where1 + 1;
$where2 = strpos( $raw, "/x00/x2C", $offset );
if ( $where2 === false )
{
break;
}
else
{
if ( $where1 + 8 == $where2 )
{
$frames ++;
}
$offset = $where2 + 1;
}
}
}
return $frames > 1;
}
Actualmente estoy teniendo problemas para cambiar el tamaño de las imágenes usando GD.
Todo funciona bien hasta que quiera cambiar el tamaño de un gif animado, que ofrece el primer fotograma sobre un fondo negro.
He intentado usar getimagesize
pero eso solo me da dimensiones y nada para distinguir entre cualquier gif y uno animado.
No se requiere el cambio de tamaño real para los gifs animados, solo poder omitirlos sería suficiente para nuestros propósitos.
¿Alguna pista?
PD. No tengo acceso a imagemagick.
Saludos cordiales,
Kris
El GIF animado debe tener la siguiente cadena
"/x21/xFF/x0B/x4E/x45/x54/x53/x43/x41/x50/x45/x32/x2E/x30"
Mientras buscaba una solución para el mismo problema, noté que el sitio php.net tiene un seguimiento del código al que se refieren Davide y Kris, pero, según el autor, requiere menos memoria y posiblemente menos disco duro .
Lo replicaré aquí, porque puede ser de interés.
fuente: http://www.php.net/manual/en/function.imagecreatefromgif.php#88005
function is_ani($filename) {
if(!($fh = @fopen($filename, ''rb'')))
return false;
$count = 0;
//an animated gif contains multiple "frames", with each frame having a
//header made up of:
// * a static 4-byte sequence (/x00/x21/xF9/x04)
// * 4 variable bytes
// * a static 2-byte sequence (/x00/x2C)
// We read through the file til we reach the end of the file, or we''ve found
// at least 2 frame headers
while(!feof($fh) && $count < 2) {
$chunk = fread($fh, 1024 * 100); //read 100kb at a time
$count += preg_match_all(''#/x00/x21/xF9/x04.{4}/x00[/x2C/x21]#s'', $chunk, $matches);
}
fclose($fh);
return $count > 1;
}
Leer todo el archivo con file_get_contents
puede llevar demasiada memoria si el archivo dado es demasiado grande. He vuelto a factorizar la función dada previamente que lee suficientes bytes para verificar cuadros y regresa tan pronto como encuentra al menos 2 fotogramas.
<?php
/**
* Detects animated GIF from given file pointer resource or filename.
*
* @param resource|string $file File pointer resource or filename
* @return bool
*/
function is_animated_gif($file)
{
$fp = null;
if (is_string($file)) {
$fp = fopen($file, "rb");
} else {
$fp = $file;
/* Make sure that we are at the beginning of the file */
fseek($fp, 0);
}
if (fread($fp, 3) !== "GIF") {
fclose($fp);
return false;
}
$frames = 0;
while (!feof($fp) && $frames < 2) {
if (fread($fp, 1) === "/x00") {
/* Some of the animated GIFs do not contain graphic control extension (starts with 21 f9) */
if (fread($fp, 1) === "/x2c" || fread($fp, 2) === "/x21/xf9") {
$frames++;
}
}
}
fclose($fp);
return $frames > 1;
}
Hay un breve fragmento de código en la página de manual de PHP de la función imagecreatefromgif()
que debería ser lo que necesita: