ImageMagick: crea GIF animado a partir de una imagen en mosaico y tiene problemas con los metadatos del "lienzo virtual"

ImageMagick: crea GIF animado a partir de una imagen en mosaico y tiene problemas con los metadatos del "lienzo virtual"

Tengo una imagen que contiene imágenes más pequeñas similares a esta:

------
| 1  |
------
| 2  |
------
| 3  |
------
| 4  |
------

Cada subimagen es de 100x200 y la imagen completa es de 100x800.

Me gustaría combinarlos todos en una sola animación que recorrerá las imágenes 1 a 4.

Utilizo la convertherramienta de imagemagick para recortar las imágenes. Por ejemplo, hice un archivo por lotes

convert %1 -crop 100x200+0+0 %~n1_01.png
convert %1 -crop 100x200+0+200 %~n1_02.png
convert %1 -crop 100x200+0+400 %~n1_03.png
convert %1 -crop 100x200+0+600 %~n1_04.png

Y luego ejecútelo en una imagen llamadamain.jpg

Esto crea un conjunto de imágenes, pero cuando intento convertirlas a un gif como este

convert *.png out.gif

En lugar de una única animación de tamaño 100x200, obtengo una animación de tamaño 100x800 y las imágenes simplemente aparecen en ciertos desplazamientos.

Cuando veo identifyun par de imágenes recortadas, me da

main_01.png PNG 100x200 100x800+0+0 8-bit sRGB 4.74KB 0.000u 0:00.000
main_02.png PNG 100x200 100x800+0+200 8-bit sRGB 3.39KB 0.000u 0:00.000

Presumiblemente, imagemagick está tratando de ser útil leyendo los metadatos y determinando que, de hecho, me gustaría usar un lienzo de 100x800 y que cada imagen debe colocarse en desplazamientos específicos. Que no es lo que quiero.

de hecho, leyendo eltutorial, imagemagick lo deja ahí para ayudarte.

Es decir, la mensajería instantánea conserva la información de "lienzo virtual", "página" o "capas" de la imagen para preservarla para su uso posterior. Esto es especialmente importante para el correcto funcionamiento del manejo de animaciones GIF.

Cuando abro cada archivo manualmente en Paint y luego lo vuelvo a guardar, cuando lo vuelvo a identificar main_02.png, aparece

main_02.png PNG 100x200 100x200+0+0 8-bit sRGB 4.03KB 0.000u 0:00.000

Haciendo esto para todas las imágenes, hago la conversión a gif nuevamente y finalmente es un gif de 100x200 que se parece a lo que quiero.

¿Cómo puedo configurar todas las compensaciones en (0, 0) para no tener que hacerlo manualmente mediante pintura?

Respuesta1

Puede restablecer las coordenadas del lienzo virtual haciendo +repagedespués del recorte:

convert %1 -crop 100x200+0+0 +repage %~n1_01.png
convert %1 -crop 100x200+0+200 +repage %~n1_02.png
convert %1 -crop 100x200+0+400 +repage %~n1_03.png
convert %1 -crop 100x200+0+600 +repage %~n1_04.png

Además, no necesita un archivo por lotes para dividir la imagen en mosaicos; si especifica solo un tamaño, se dividirá en mosaicos, use "%d" en el nombre del archivo de salida para el número de mosaico:

convert %1 -crop 100x200 +repage %~n1_%d.png

O en su caso con el número de ancho fijo de dos dígitos:

convert %1 -crop 100x200 +repage %~n1_%02d.png

Eso generará cuatro imágenes.

De hecho, también puedes realizar la conversión GIF con el mismo comando, sin tener que generar ningún archivo de imagen intermedio temporal. El siguiente comando hará todo lo que quieras de una sola vez:

convert %1 -crop 100x200 +repage out.gif

Para más información, verla documentación para-cropy también+repage(tenga en cuenta que -repagetambién se puede utilizar para editar datos de lienzo virtual en cualquier imagen por sí solo).


Por cierto, una forma alternativa de dividir imágenes es especificar elnúmerode azulejos en lugar del tamaño de los azulejos; Puedes hacer esto especificando el tamaño.en azulejospara recortar y agregar un signo "@", por ejemplo, esto produce los mismos resultados que arriba:

convert %1 -crop 1x4@ +repage %~n1_%02d.png

información relacionada