Konvertiert Graustufenbilder in Alphakanalbilder in der Unix-Shell

14

Ich habe ein Graustufenbild. Ich möchte es in eine transparente PNG-Datei konvertieren, sodass die schwarzen Pixel (im Originalbild) vollständig undurchsichtig werden, die weißen Pixel vollständig transparent werden, 50% graue Pixel zu 50% transparent werden und so weiter für alle Schattierungen zwischen.

Wie kann ich das erreichen?

(Ja, ich weiß, dass dies fast die gleiche Frage ist wie das Konvertieren von Graustufen in Alphakanäle , aber ich möchte wissen, wie dies nur mit Befehlszeilentools möglich ist - z. B. ImageMagick oder NetPBM.)

Hier ist ein Beispielergebnis aus der oben genannten Frage. Dieses Beispiel ist ein Ergebnis, das ich nur mit Befehlszeilentools erzielen möchte.

Stichprobe

Wenn Sie diese PNG in einem Viewer öffnen, der Transparenz unterstützt, werden Sie sehen, was ich meine.

zrajm
quelle

Antworten:

18

Ooookay. Nachdem Sie viel gegoogelt und mehr im ImageMagick-Handbuch nachgelesen haben, als mir wichtig ist, ist hier die Antwort. Unter der Voraussetzung, dass Sie ein Graustufenbild haben source.png, sind hier meine Befehle.

Führen Sie den folgenden Befehl aus , um die schwarzen Pixel transparent zu machen und die weißen Pixel unverändert zu lassen:

 convert source.png -alpha copy -fx '#fff' result.png

Um stattdessen die weißen Pixel transparent zu machen und das Schwarz unverändert zu lassen, verwenden Sie:

 convert source.png -alpha copy -channel alpha -negate +channel -fx '#000' result.png

Lassen Sie uns diesen letzten Befehl etwas genauer erklären:

  • convert - Ist der ImageMagic-Befehl (einer von mehreren)
  • source.png - Das Graustufen-Quellbild.
  • -alpha copy - Kopieren Sie den Inhalt der vorherigen Datei in den Alphakanal.
  • -channel alpha - Geben Sie an, dass nur die folgenden Operatoren den Alphakanal beeinflussen sollen.
  • -negate- Invertieren Sie den Alpha-Kanal (wirkt sich aufgrund des vorherigen -chanel alphanicht auf einen anderen Teil des Bildes aus).
  • +channel- Geben Sie an, dass nur die folgenden Operatoren die Farbkanäle beeinflussen und den Alphakanal nicht mehr ändern sollen. (Dies ist die Standardeinstellung, daher müssen wir sie im ersten, einfacheren Beispiel nicht angeben.)
  • -fx '#000'- Ersetzen Sie den Farbkanalinhalt durch schwarze Pixel. (Wegen des +channelAlphakanals wird das nicht beeinflusst).

Es ist sehr wichtig, diese letzte -fxOption einzuschließen, da sonst alle semitransparenten Pixel im generierten Bild Farben behalten. (Da diese Pixel halbtransparent sind, ist es möglicherweise nicht offensichtlich, aber das Endergebnis ist nicht das, was man erwartet.)

Ich fand die Liste der ImageMagick-Optionen sehr nützlich.

zrajm
quelle
Eine ziemlich gute Erklärung, um mein Ziel zu erreichen, wenn ich den zweiten Befehl verwende, der mein Bild dunkler macht als das tatsächliche Graustufenbild. Eigentlich ist mein Ziel, den gleichen Farbton zu erzielen, der in anderen Graustufen als dieser Transparenz vorhanden ist, wie erwartet. Irgendeine Idee, um das zu erreichen?
Hardik Patel
das ist sehr nützlich, danke! :) froh, dass ich es nicht selbst herausfinden musste
Sam Watkins
Ich liebe dich!!!!!!
Mescarra
Diese Art von Kommentaren ist wahrscheinlich besser, wenn Sie sie über diesen Kanal an mich senden: okcupid.com/profile/zrajm :)
zrajm
1
Ich weiß nicht warum, aber mit der aktuellen Version (ImageMagick 7.0.7-21) erhalte ich nur ein solides Weiß / Schwarz-Bild ohne Alphakanal. Ich habe die Befehlszeile wörtlich kopiert und nur die Eingabe- / Ausgabedateipfade geändert. Vielleicht haben sie einige inkompatible Änderungen vorgenommen.
Anzeigename
0

Mit ImageMagick 7.0 funktioniert die obige Antwort nicht mehr. Aber Sie können verwenden:

convert source.png -channel rgb -fx '#fff' result.png

Aka, füllen Sie die RGB-Kanäle mit Leerzeichen und lassen Sie das Alpha wie zuvor.

tito
quelle
Ich vermute, Sie haben die '-alpha-Kopie' verpasst :)
Chris
0

Bei imagemagick 7 ist es notwendig, -channel RGBvor dem anzugeben -fx, ansonsten erhalten Sie ein durchgehend schwarzes Bild, wie folgt :

convert input.png -alpha copy -channel RGB -fx '#000' out.png

Und Negieren ist nützlich, wenn Schwarz und Weiß undurchsichtig sein sollen:

convert input.png -negate -alpha copy -channel RGB -fx '#000' out.png
Chris
quelle