2012-02-23 27 views
5

puedo hacerlo fácilmente en mi sistema operativoHacer un GIF animado con ImageMagick API de PHP

convert -delay 1/1 -loop 0 *.gif animated.gif 

Pero no puedo encontrar la manera de hacer esto en la API de PHP. Sin cambio de tamaño ni nada que necesite, acabo de obtener un conjunto de marcos que necesitan animación.

+0

Para empezar, puede usar el [operador de ejecución] (http://php.net/manual/en/language.operators.execution.php) (patillas): '\' convert-delay 1/1 -loop 0 * .gif animated.gif \ ''. – hakre

+0

o el 'exec()' pero eso es muy complicado y he declarado que quiero usar la API – jdborg

+0

Sí, es más un comentario que la respuesta real. ¿Qué dice el manual? Debería ofrecer una interfaz, creo. – hakre

Respuesta

13

Si bien no soy un experto en PHP, sé que este problema no es demasiado difícil. Lo que quiere hacer es crear un objeto Imagick al que pueda agregar sus marcos. Con cada fotograma puede cambiar parámetros como el tiempo, etc.

Suponiendo que está trabajando con imágenes que se cargan desde un formulario web básico, he escrito un ejemplo básico que recorre las imágenes cargadas con un nombre de " image0 ", donde" 0 "sube a pesar de que se incluyen muchos archivos. Naturalmente, simplemente puede agregar imágenes utilizando los mismos métodos en nombres de archivos fijos o lo que sea.

$GIF = new Imagick(); 
$GIF->setFormat("gif"); 

for ($i = 0; $i < sizeof($_FILES); ++$i) { 
    $frame = new Imagick(); 
    $frame->readImage($_FILES["image$i"]["tmp_name"]); 
    $frame->setImageDelay(10); 
    $GIF->addImage($frame); 
} 

header("Content-Type: image/gif"); 
echo $GIF->getImagesBlob(); 

Este ejemplo crea un objeto Imagick que es lo que se convertirá en nuestro GIF. Los archivos que se cargaron al servidor se bifurcan y se lee primero cada uno (recuerde, sin embargo, que esta técnica se basa en que las imágenes se nombran como describí anteriormente), en segundo lugar, obtiene un valor de retardo y, en tercer lugar, se agrega a el GIF-a-ser. Esa es la idea básica, y producirá lo que estás buscando (espero).

Pero hay mucho que manipular, y su configuración puede verse diferente. Siempre encontré la referencia php.net Imagick API para chupar, pero aún así es bueno tenerla y la uso de vez en cuando para hacer referencia a cosas del ImageMagick estándar.

Espero que esto coincida con lo que estabas buscando.

+0

+1 para la respuesta bien escrita, pero parece que no funciona. Estoy creando una matriz de archivos y luego recorte cada uno con el código que has hecho (y el último ejemplo aquí http://www.php.net/manual/en/imagick.addimage.php) pero todo lo que veo es la última imagen Incluso si configuro 500ms y espero. Me gustaría repetir y no puedo encontrar eso tampoco. – jdborg

+0

Ah, esto funciona si usas writeImages en lugar de echo. Aunque prefiero hacer eco. ¿Algunas ideas? – jdborg

+0

Malo, olvidé un detalle importante allí, editando la respuesta :) El método getImagesBlob() corresponde a establecer el segundo argumento en writeImages() en verdadero. Y esto hará eco de un GIF animado como un blob, que debería funcionar. – fredrikekelund

Cuestiones relacionadas