Wie ändere ich die Leinwandgröße eines PNG mit ImageMagick (GraphicsMagick)? (Wie mit Transparenz auffüllen?)

9

Alternativ: Wie nehme ich ein nicht quadratisches PNG und "fülle" den "Rest" des Bildes mit Transparenz aus, so dass das resultierende quadratische Bild das Originalbild im Quadrat zentriert hat?

ULTIMATIV möchte ich jedes Bild eines GM-unterstützten Formats jeder Größe aufnehmen und ein verkleinertes PNG (z. B. maximal 40 Pixel für jede Dimension) erstellen, wobei das Seitenverhältnis beibehalten und die Transparenz für Nichtquadrate aufgefüllt wird Originalbilder UND mit einer bereits vorbereiteten 40x40 PNG-Transparenzmaske.

Ich weiß bereits, wie man das Seitenverhältnis verkleinert und beibehält. Ich habe bereits den Befehl zum Anwenden meines Verbunds. Mein einziges fehlendes Stück sind quadratische, nicht quadratische Bilder (Polsterung mit Transparenz).

Einzelbefehl bevorzugt; Multi-Befehlskette akzeptabel.

(bearbeiten)

Zusätzliche Informationen: Hier ist der zusammengesetzte Befehl, den ich verwende:

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

Dabei hat mask.png weiße Pixel für das, was ich von source-and-target.png behalten möchte, und transparente Pixel für das, was ich von source-and-target.png entfernen (und transparent werden) möchte.

Pistos
quelle

Antworten:

7

Dieser Befehl verwendet eine Eingabedatei beliebiger Größe und passt sie am besten an ein 40 x 40-Quadrat und ein Pad mit Transparenz an:

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

Die gravityOption stellt sicher, dass das Bild in beide Richtungen zentriert transparentist und überall dort verwendet wird, wo keine Pixel vorhanden sind. Dann erfolgt das Compositing mit demmask.png

Paul
quelle
Also können wir es nicht auf einmal machen composite?
Pistos
@Pistos Mir ist nicht klar, was Sie mit dem Composite machen - es ist nur eine Transparenzmaske, um Teile der Miniaturansicht nach dem Ändern der Größe auszublenden / anzuzeigen? Können Sie die bisherige Befehlssequenz bearbeiten und hinzufügen, damit wir sehen können, ob sie kombiniert werden kann?
Paul
@Pistos Ich denke, der beste Ansatz ist das Compositing mit -convert und nicht umgekehrt. Ich habe meine Antwort oben aktualisiert.
Paul
Nah dran, aber nicht ganz. Ihr Befehl hat nicht wie er ist funktioniert, und selbst mit Anpassungen hat er nicht funktioniert. Es ist okay, ich mache es in zwei Schritten. Ich werde die Dinge hier aktualisieren, nachdem ich die letzten, funktionierenden CLI-Schritte erhalten habe. Danke noch einmal.
Pistos
Ich würde -filter Catromvor der thumbnailOption hinzufügen, da sie meiner Erfahrung nach im Allgemeinen Bilder mit höherer Qualität erzeugt.
Do
6

Ein Befehl zum Konvertieren aller PNGs aus einem Ordner:

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

mogrify ist ein Befehl aus dem ImageMagick-Paket. Sie müssen zuerst das Ausgabeverzeichnis erstellen.

uı6ʎɹnɯ ꞁəıuɐp
quelle
Schön. Übrigens, wenn Sie sich abenteuerlustig fühlen, können Sie die -path resizedBearbeitung der vorhandenen Dateien unterlassen .
aaronk6
Das ist toll. Auf meiner installieren (OSX, 1.3.35) es ist gm mogrifyund statt -path resized, Verwendung-create-directories -output-directory resized
Blake
1

Hier ist, was ich schließlich ging. Ein zweistufiger Prozess:

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

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

Wobei mask.png weiße Pixel für das ist, was ich behalten wollte, und transparente Pixel für das, was ich maskieren wollte (verwerfen).

Pistos
quelle