print poner pagina jpg imagejpg imagejpeg crear como php gd

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; }