Comment modifier la taille du canevas d'un PNG avec ImageMagick (GraphicsMagick)? (Comment remplir avec transparence?)

9

Alternativement: Comment prendre un PNG non carré et "remplir" le "reste" de l'image avec transparence afin que l'image carrée résultante ait l'image d'origine centrée dans le carré?

En fin de compte, ce que je veux, c'est prendre n'importe quelle image de n'importe quel format pris en charge par GM de n'importe quelle taille, et créer un PNG réduit (disons, 40 pixels maximum pour chaque dimension), avec un rapport d'aspect maintenu, avec un rembourrage de transparence pour les non carrés images originales ET avec un masque de transparence PNG 40x40 déjà préparé appliqué.

Je sais déjà comment réduire et conserver les proportions; J'ai déjà la commande pour appliquer mon composite. Ma seule pièce manquante est la mise en carré d'images non carrées (remplissage avec transparence).

Commande unique préférée; chaîne multi-commandes acceptable.

(Éditer)

Information supplémentaire: voici la commande composite que j'utilise:

gm composite -compose copyopacity mask.png source-and-target.png source-and-target.png

où mask.png a des pixels blancs pour ce que je veux garder de source-and-target.png et des pixels transparents pour ce que je veux supprimer (et devenir transparent) de source-and-target.png.

Pistos
la source

Réponses:

7

Cette commande prendra n'importe quel fichier d'entrée de taille et l'adaptera le mieux à un carré 40x40 et un pad avec transparence:

convert \
   original.png \
  -thumbnail '40x40>' \
  -background transparent \
  -gravity center \
  -extent 40x40 \
  -compose Copy_Opacity \
  -composite mask.png \
   original-resized.png

L' gravityoption garantit que l'image est centrée dans les deux directions et transparentest utilisée partout où il n'y a pas de pixels. Ensuite, le compositing se fait avec lemask.png

Paul
la source
Nous ne pouvons donc pas le faire en une seule fois avec composite?
Pistos
@Pistos Je ne sais pas exactement ce que vous faites avec le composite - est-ce juste un masque de transparence pour masquer / afficher des parties de la vignette après le redimensionnement? Pouvez-vous modifier et ajouter la séquence de commandes que vous avez jusqu'à présent, afin que nous puissions voir si elle peut être combinée?
Paul
@Pistos Je pense que la meilleure approche est de faire le compositing avec -convert plutôt que l'inverse. J'ai mis à jour ma réponse ci-dessus.
Paul
Fermer, mais pas tout à fait. Votre commande n'a pas fonctionné telle quelle, et même avec des ajustements, elle n'a pas fonctionné. Ça va, je vais le faire en deux étapes. Je mettrai à jour les choses ici après avoir obtenu les étapes CLI finales et fonctionnelles. Merci encore.
Pistos
J'ajouterais -filter Catromavant l' thumbnailoption car d'après mon expérience, elle produit généralement des images de meilleure qualité.
thdoan
6

Une commande pour convertir tous les PNG à partir d'un dossier:

mogrify \
 -resize 50x50 \
 -background transparent \
 -gravity center \
 -extent 50x50 \
 -format png \
 -path resized \
 *.png

mogrify est une commande du package ImageMagick. Vous devez d'abord créer un répertoire de sortie.

uı6ʎɹnɯ ꞁəıuɐp
la source
Joli. BTW, si vous vous sentez aventureux, vous pouvez omettre -path resizedde modifier les fichiers en place.
aaronk6
C'est bien. Sur mon installation (OSX, 1.3.35) c'est gm mogrifyet au lieu de -path resized, utilisez-create-directories -output-directory resized
Blake
1

Voici ce que j'ai finalement choisi. Un processus en deux étapes:

gm convert \
  -thumbnail '40x40>' \
  -background transparent \
  -gravity center \
  -extent 40x40 \
   original.png \
   intermediate.png

gm composite \
  -compose in \
   intermediate.png \
   mask.png \
   out.png

Où mask.png correspond aux pixels blancs pour ce que je voulais conserver et aux pixels transparents pour ce que je voulais masquer (jeter).

Pistos
la source