1

Étant donné une image GIF animée sur une couleur de fond solideComment couper un gif animé (en utilisant imagemagick)?

animated bunny with padding

Je voudrais couper loin le rembourrage. Concrètement, je voudrais recadrer l'image dans la mesure maximale de l'objet de premier plan sur toutes les images:

animated bunny without padding

Je ne peux pas sembler trouver la bonne combinaison de -alpha, -background pour y parvenir avec un commande unique convert. Par exemple, si je lance

convert -dispose 2 input.gif -trim -layers TrimBounds fail.gif 

Je reçois des couleurs « de fond » au hasard pour les cadres dont individuels degrés parés sont plus petits que la mesure sur toutes les trames:

animated bunny with bad background colors

Je peux obtenir la sortie correcte avec une longue chaîne de commandes:

convert input.gif -trim -layers TrimBounds out-%03d.miff 
mogrify -background "rgb(20%,30%,80%)" -layers flatten out-*.miff 
convert out-*.miff output.gif 
rm out-*.miff 

Ceci est lent, écrit un tas de fichiers temporaires, et nécessite de connaître la couleur de fond ("rgb(20%,30%,80%)") explicitement.

Existe-t-il un moyen plus simple de rogner un gif animé?

Cette related question considère le recadrage explicite plutôt que le recadrage automatique.

Répondre

2

Ceci est une question intéressante. Pour l'instant, je ne vois pas comment l'améliorer pour que des fichiers supplémentaires ne soient pas nécessaires. Mais je vais l'examiner plus avant. Mais je peux nettoyer un peu votre code et le rendre plus facile pour vous et rendre le fichier output.gif correct.

bgcolor=`convert oHBWq.gif[0] -format "%[pixel:u.p{0,0}]" info:` 
convert oHBWq.gif -trim -layers TrimBounds out-%03d.miff 
mogrify -background "$bgcolor" -layers flatten out-*.miff 
convert -dispose previous -delay 10 out-*.miff -loop 0 output.gif 
rm out-*.miff 

enter image description here

Cela fait la même chose que ci-dessus, mais nécessite l'enregistrement 1 fichier miff multiples. Le traitement de la boucle du sous-shell est similaire à votre mogrify.

bgcolor=`convert oHBWq.gif[0] -format "%[pixel:u.p{0,0}]" info:` 
num=`convert oHBWq.gif -format "%n\n" info: | head -n 1` 
convert oHBWq.gif -trim -layers TrimBounds tmp.miff 
(for ((i=0; i<num; i++)); do 
convert tmp.miff[$i] -background "$bgcolor" -layers flatten miff:- 
done) |\ 
convert -dispose previous -delay 10 - -loop 0 output2.gif 
rm tmp.miff 

Cela fonctionne aussi sans avoir à enregistrer les fichiers temporaires, mais doit répéter les -layers -trim limites pour chaque garniture itération de la boucle.

bgcolor=`convert oHBWq.gif[0] -format "%[pixel:u.p{0,0}]" info:` 
num=`convert oHBWq.gif -format "%n\n" info: | head -n 1` 
echo "num=$num" 
(for ((i=0; i<num; i++)); do 
convert oHBWq.gif -trim -layers TrimBounds miff:- |\ 
convert -[$i] -background "$bgcolor" -layers flatten miff:- 
done) |\ 
convert -dispose previous -delay 10 - -loop 0 output3.gif 

Ceci est proche, mais pour une image:

bgcolor=`convert oHBWq.gif[0] -format "%[pixel:u.p{0,0}]" info:` 
convert -dispose previous -delay 10 oHBWq.gif -trim -layers TrimBounds -background "$bgcolor" -layers optimize -loop 0 output5.gif 

enter image description here

+0

Ils vont définitivement dans le bon sens. C'est étonnamment difficile à faire en utilisant convert, non? –

+0

Il semblerait que oui. Mais je vais continuer à regarder dedans. – fmw42

2

Enfin, cela semble fonctionner dans ImageMagick avec une ligne pour obtenir la couleur de fond et une ligne de traitement. Aucun fichier temporaire n'est nécessaire.

bgcolor=`convert input.gif[0] -format "%[pixel:u.p{0,0}]" info:` 
convert -dispose previous -delay 10 -background "$bgcolor" input.gif -trim -layers TrimBounds -coalesce -layers optimize -loop 0 output.gif 

enter image description here

2

Vous pouvez accomplir ce genre de rognage à l'aide "de -distort" IM avec une fenêtre définie.

convert oHBWq.gif -coalesce +repage -background none \ 
    \(-clone 0--1 -trim -flatten -trim \) \ 
    -set option:distort:viewport %[fx:u[-1].w]x%[fx:u[-1].h]+%[fx:u[-1].page.x]+%[fx:u[-1].page.y] \ 
    -delete -1 -distort SRT 0 +repage output.gif 

que les clones les trames d'entrée, les garnitures individuellement, et les aplatit en gardant leur alignement initial. Ensuite, il aplatit encore une fois pour se débarrasser de l'arrière-plan transparent en excès. Le résultat sera la bonne taille et aura les bons décalages de page pour les images finies. Vous n'avez pas besoin de connaître la couleur de fond.

Maintenant, vous pouvez facilement obtenir ces dimensions et décalages dans un paramètre de fenêtre déformée et effectuer une distorsion sans opération. Supprimez le clone aplati qui a été utilisé pour obtenir les mesures, "+ répétez" le reste, et terminez avec les autres paramètres GIF dont vous avez besoin.