ImageMagick "Farbe zu Alpha" (wie The GIMP)

7

Ich versuche zu tun, was The GIMP tut, wenn "Farbe zu Alpha" mit einer tatsächlichen Farbe ausgewählt wird.

Ich habe ein Bild mit der Farbe # a0132e, und ich möchte das in Transparenz konvertieren. Nicht nur diese exakte Farbe, sondern auch jede davon abgeleitete Farbe muss so halbtransparent werden. Das macht "color to alpha" in GIMP.

Ich habe eine Million verschiedene Dinge ausprobiert, aber ich kann mich nicht darum kümmern. Ich habe mich selbst für ein paar Stunden frustriert, indem ich den Parameter -fx getestet habe und es ist eine absolut seltsame Syntax, so dass das überhaupt nicht geholfen hat. Vielleicht werden einige der Optionen für convert ausreichen, aber ich habe noch nicht das Richtige gefunden, und wirklich, ich habe alles versucht, was Google mir gebracht hat.

Idealerweise möchte ich ein Skript erstellen, das ich so nennen kann:

color-to-alpha.cmd original.png output.png #a0132e

oder ähnlich. Wie kann ich das tun?

    
Thany 16.10.2014, 15:17
quelle

2 Antworten

18

1. Grundlagen zu ImageMagick-Befehlszeilenparametern

Zunächst einmal: Bitte lesen Sie auch meine Antwort " ImageMagick Befehlszeilenoption (und Kategorien von Befehlszeilenparametern) ". Es erklärt ein paar Grundlagen über die Befehlszeilenstruktur von ImageMagick. Insbesondere erklärt es die Hauptunterschiede zwischen:

  1. Bildeinstellungen
  2. Bildoperatoren und
  3. Bildsequenzoperatoren

Diese Unterschiede sind ein entscheidendes Konzept, um komplexe ImageMagick-Befehlszeilen analysieren zu können.

2. Grundlagen über ImageMagick 'beiseite' Verarbeitung

Der vorgeschlagene Befehl ist ziemlich fortgeschritten. Es verwendet Klammern , um zwei verschiedene Abschnitte der vollständigen Befehlszeile zu trennen.

Parenthesized Befehlsabschnitte ermöglichen Bilder "beiseite" des Hauptbefehls zu verarbeiten: Sie können damit eine separate Bildliste bearbeiten und das Ergebnis dieser separaten Verarbeitung an das Ende der vorherigen Liste setzen. (Sie können mehrere verwenden und sogar verschachtelte Bildverarbeitungsoperationen in Klammern in einer einzigen ImageMagick-Befehlszeile verwenden.) In gewisser Weise dient es als Notizblock, wo Sie an einer Teilmenge von Bildern arbeiten und das Ergebnis zurück in die Hauptbildliste bringen.

Jedes Öffnen eines Klammerpaars (" ( ") startet eine neue Bildliste. Alle aufeinander folgenden Parameter innerhalb der Klammern gelten nur für die neue Bildliste. Der abschließende (" ) ") Teil eines entsprechenden Klammerpaares schließt alle "Neben" -Verarbeitung ab und platziert die resultierende Bildliste von "neben" (dies kann bestehen von null, einem oder mehreren Bildern) auf die Hauptbildliste.

Die einzige kleine Änderung, die ich an @ dlemstras ursprünglichen Befehl mache: Ich entkomme dem ( und ) Vorkommen mit einem umgekehrten Schrägstrich und ersetzen diese durch \( und \) . Dies ist erforderlich, damit eine Shell wie Bash nicht versucht, diese Zeichen falsch als Anfang und Ende einer Untershell zu interpretieren.

Wichtig: Wenn Sie die Begrenzungszeichen ( und ) für die Verarbeitung auf der Seite verwenden , Sie MÜSSEN Leerzeichen um sie herum lassen - sonst funktionieren sie nicht!

3. Formatieren Sie den ursprünglichen Befehl erneut

Zuerst mache ich eine Umformatierung für @ dlemstras ursprünglich vorgeschlagenen Befehl. Dies ändert seine Bedeutung im Großen und Ganzen nicht. Es setzt nur jede Einstellung und jede Operation auf eine eigene Zeile.

(Dies gilt für Mac OSX und Linux - für Windows ersetzen Sie einfach alle \ Zeilenfortsetzungszeichen durch ^ .)

%Vor%

4. Nun dissektiere diesen Monsterbefehl zeilenweise

  1. Zeile 1: convert
    Dies ist der ImageMagick-Befehl , der ausgeführt werden soll.

  2. Zeile 2: original.png
    Dies ist das erste Eingabebild , das verarbeitet werden kann. Zu diesem Zeitpunkt ist dies das einzige Bild in der Hauptbildliste.

  3. Zeile 3: \(
    Öffnen Sie eine neue (leere) Bildliste, die "beiseite" von der Hauptbildliste verarbeitet werden soll.

  4. Zeile 4: -clone 0
    "- Klon" ist ein Bildstapeloperator . Es wird aufgefordert, einen Klon dieses Bildes aus der letzten "gedrückten" Bildsequenz zu erstellen. Das letzte Bild aus der letzten verschobenen Bildsequenz hat den Index 0 . Mit anderen Worten: Legen Sie eine Kopie von original.png in die aktuelle "neben" -Bildliste.

  5. Zeile 5: -fill "#a0132e"
    "- fill" ist eine Bildeinstellung . Er definiert die Füllfarbe, die beim Füllen eines Grafikgrundelements verwendet werden soll. "# a0132e" ist eine Art Rot.

  6. Zeile 6: -colorize 100
    "- colorize" ist eine Bildoperation . Es koloriert das Bild um den angegebenen Betrag (hier: 100 ), wobei die Farbe verwendet wird, die in der Einstellung -fill angegeben wurde. Das Ergebnis ist ein Bild mit der gleichen Größe wie original.png . Dieses Bild hat die einheitliche Farbe "# a0132e" . Mit anderen Worten: Das neu erstellte Bild ist ein rötlicher Fleck mit der gleichen Größe wie original.png .

  7. Zeile 7: \)
    Dies schließt die Nebenverarbeitung und legt das resultierende Bild am Ende der Hauptbildliste ab. Jetzt gibt es 2 Bilder in der Hauptbildliste: zuerst, original.png ; zweitens die rötliche, einheitlich gefärbte Farbe derselben Größe, die im "Nebenprozess" erzeugt wurde.

  8. Zeile 8: ( Öffnen Sie eine weitere neue Bildliste für eine weitere "Neben" -Verarbeitung.

  9. Zeile 9: -clone 0,1
    "- Klon" ist (noch :) ein Bildstapeloperator . Hier werden die Bilder mit den Indizes 0 und 1 geklont. Mit anderen Worten: Legen Sie eine Kopie von original.png und eine Kopie des einheitlich gefärbten "rötlichen" in die aktuelle "Neben" -Liste.

  10. Zeile 10: -compose difference
    "- komponieren" ist eine Bildeinstellung . Es definiert den spezifischen zusammengesetzten Operatoralgorithmus, der später verwendet werden soll, in unserem Fall Unterschied .

  11. Zeile 11: -composite
    "- zusammengesetzt" ist ein Bildsequenzoperator . Es führt Alpha-Komposition für zwei Bilder und eine optionale Maske aus. Nachdem dieser Operator angewendet wurde, ist nur noch ein Bild in der "Neben" -Bildsequenz übrig. Dieses Bild ist das Ergebnis des Zusammensetzens des Klons von original.png mit dem einheitlich gefärbten "rötlichen" Bild unter Verwendung des Algorithmus "difference" .

  12. Zeile 12: -separate
    "- separate" ist ein weiterer Bildsequenzoperator . Es trennt einen Bildkanal in ein Graustufenbild. Nachdem dieser Operator beendet ist, wird eine Anzahl von Graustufenbildern in der "Neben" -Bildsequenz verbleiben. Diese Zahl hängt von der tatsächlichen Einstellung -channel ab, die zum Zeitpunkt der Anwendung von -separate aktiv war.

  13. Zeile 13: +channel
    "- channel" ist eine Bildeinstellung . Normalerweise erscheint es als -channel <type> , um anzugeben, welche Kanäle verwendet werden sollen. (Beispiele: -channel Red für rot, oder -channel GB für grün + blau, oder -channel Alpha , oder -channel CMY oder -channel Cyan,Magenta,Yellow sowohl für Cyan + Magenta + Gelb). Das spezielle + -Präfix mit +channel bedeutet: Setzen Sie den Wert auf die Standardwerte zurück. Diese Standardeinstellungen ...

  14. Zeile 14: -evaluate-sequence max
    "- evaluate-sequence" ist ein Bildsequenzoperator . Es ändert die Kanalpixel, indem es einen arithmetischen, relationalen oder logischen Ausdruck über eine Sequenz von Bildern auswertet. In unserem Fall wird "max" gesetzt. Die "max" -Methode ruft die maximalen (helleren) Wertewerte für jedes Pixel aus der Sequenz ab. Als Ergebnis dieses Operators wird ein Bild übrig bleiben, wobei das Pixel jeder Position den hellsten Wert verwendet, nachdem die jeweiligen Pixel jedes der Bilder von der Sequenz verglichen wurden.

  15. Zeile 15: -auto-level
    "- auto-level" ist ein Bildoperator . Es passt automatisch Farbstufen eines Bildes an.

  16. Zeile 16: \)
    Dies schließt die Nebenverarbeitung. Das resultierende Bild der Seitenbearbeitung wird nun in die Hauptbildliste platziert. Die Hauptbildliste besteht zur Zeit aus 3 Bildern: original.png , das "rötliche" Bild, sowie das Bild, das durch die vorherige "beiseite" Bearbeitung erzeugt wurde.

  17. Zeile 17: -delete 1
    "- delete" ist ein Bildsequenzoperator . Es löscht Bilder nach Index aus einer Bildsequenz. Index 1 gibt das zweite Bild in der Sequenz an (denken Sie daran: die Indizierung ist 0-basiert). Nachdem dieser Operator beendet ist, werden nur 2 der vorherigen 3 Bilder in der aktuellen "Neben" -Bildsequenz übrig bleiben (weil das zweite der drei Bilder gelöscht wurde). Wenn meine Zählung bis jetzt korrekt ist, sollte das gelöschte Bild das einheitlich gefärbte "rötliche" sein, das durch den ersten "Beiseit" -Prozess erzeugt wurde. Nachdem dieser Vorgang abgeschlossen ist, bleiben 2 Bilder in der Hauptbildliste übrig.

  18. Zeile 18: -alpha off
    "- alpha" ist eine Bildeinstellung . Hier schaltet es den Alpha-Kanal für das Bild (die Bilder) aus. Hinweis , nur dies deaktiviert den Transparenzkanal des Bilds. Es löscht oder ändert die vorhandenen Daten nicht. Es deaktiviert nur die Verwendung dieser Daten für die nachfolgende Verarbeitung. (Wenn die vorhandenen Daten selbst geändert würden, würde dies als Operator und nicht als Einstellung gelten.)

  19. Zeile 19: -compose over
    "- komponieren" ist (noch :) eine Bildeinstellung . Er legt den Algorithmus fest, der von einem nachfolgenden Operator -composite image auf "over" verwendet werden soll. Dieser Algorithmus kombiniert die Quelle über das Ziel. Dies ist die standardmäßige Mischformmethode für Alpha-Überblendungen.

  20. Zeile 20: -compose copy_opacity
    "- komponieren" ist (noch :) eine Bildeinstellung . Hier wird der zusammengesetzte Algorithmus auf "copy_opacity" gesetzt. Da es direkt auf die Einstellung -compose over folgt, wird diese Einstellung ungültig!

    Mit anderen Worten: Sie können auch die Einstellung -compose over (Zeile 19) aus dem vollständigen Befehl überspringen. Diese Unterlassung sollte für das Endergebnis keinen Unterschied machen.

  21. Zeile 21: -composite
    "- zusammengesetzt" ist (noch :) ein Bildsequenzoperator .In unserem Fall wird dies den Algorithmus "copy_opacity" auf das zusammengesetzte Bild anwenden. Dadurch wird der angegebene Kanal, Opazität, vom Quellbild auf denselben Kanal im Zielbild kopiert.

  22. Zeile 22: output.png
    Diese Zeile legt den Namen des Ausgabebilds fest.

5. Visualisiere jeden Schritt des Befehls - füge +write filename ein

Falls Sie nicht damit vertraut sind, hier ein zusätzlicher Hinweis.

Sie können

einfügen %Vor%

(fast) überall in der Befehlszeile - sogar mehrmals. Der Operator write schreibt dann das aktuell geladene Bild (oder die aktuell geladene Bildsequenz) in seinem aktuell verarbeiteten Zustand an das angegebene Ausgabeziel.

Dieses Ausgabeziel kann eine Datei sein oder show: oder was auch immer sonst für IM-Ausgaben gilt. Nach dem Schreiben in die Ausgabe wird die Verarbeitung des ursprünglichen Befehls fortgesetzt und fortgesetzt.

Natürlich ist es nur sinnvoll, +write nach dem ersten (oder einem anderen) Bild (Sequenz) operator einzufügen (nicht nach einem Bild Einstellungen ) - - Sonst hat sich die aktuelle Bildliste nicht geändert.

Wenn mehrere Bilder ausgegeben werden (weil die aktuelle Bildliste aus mehr als einem Bild besteht), weist ImageMagick dem entsprechenden Dateinamen automatisch Indexnummern zu.

Das ist ein toller Trick! Wenn Sie es für Ihre eigene ImageMagick-Befehlsentwicklung verwenden, werden Sie es bald unentbehrlich finden. Es hilft enorm beim Debuggen (oder Optimieren, Optimieren, Vereinfachen ...) komplexer Befehlseinstellungen.

6. Geänderte Befehlszeile mit passendem +write filename

Wenn Sie ein visuelles Verständnis über die obige zeilenweise Erläuterung von Bildeinstellungen, Bildoperationen und Bildsequenzoperationen benötigen, führen Sie diesen modifizierten Befehl aus. Sehen Sie sich die einzelnen Bilder an, die mit den +write -Befehlen erstellt wurden, und vergleichen Sie sie mit den entsprechenden Erklärungen im vierten Abschnitt dieser Antwort:

%Vor%

7. Original-, Zwischen- und Ausgabebilder unterhalb von

Ok, währenddessen habe ich die vorherigen Befehle auf einem Eingabebild ausgeführt. Das folgende Bild zeigt es neben dem Original. Vielleicht war das Original.png, das ich für den Test ausgewählt habe, nicht wirklich geeignet, um neben der Farbe '# a0132e' zu testen. Aber da @Thany nicht auf @MarkSetchells Kommentar geantwortet hat und um ein Beispielbild gebeten hat, musst du mit meiner Wahl leben:

Hier sind die Ergebnisse des modifizierten Befehls, der die multiplen +write Zusätze zur ursprünglichen Befehlszeile verwendet hat.

Wie zu erwarten ist, sieht original.png genauso aus wie sein Klon, ebenso wie einige andere geklonte Bilder.

Mehrere Dateinamen mit identischen Präfixen 1--- , 2--- , ... ergeben sich aus dem gleichen +write -Befehl, der mehrere Bilder zum Speichern in der aktuell geladenen Bildliste gefunden hat.

8. Übung für den Leser

Überprüfen Sie, ob meine Aussage zu Zeile 19 oben durch Zeile 20 für ungültig erklärt wurde. Entfernen Sie -compose over von der Befehlszeile und testen Sie, ob das Ergebnis immer noch das gleiche ist.

Aktualisieren

Diese Antwort habe ich ursprünglich geschrieben, um die Befehlszeile, die @dlemstra gegeben hat, im Detail zu erklären. Die Antwort von Dirk basiert auf einem ImageMagick-Skript, das von Fred Weinhaus geschrieben wurde, color2alpha . Ich habe mich erst jetzt Fred's Skript genauer angesehen:

Freds Skript bietet einige zusätzliche und sehr raffinierte Optionen:

  1. Es kann eine beliebige Farbe im Eingabebild angeben, die als Basis für die Erstellung des rampenförmigen Alphakanals verwendet wird.
  2. Es kann eine andere Farbe angeben, um die Alphacolor in der Ausgabe zu ersetzen.
  3. Es implementiert ein "Gain" -Steuerelement, das den Übergang von Weiß zu Schwarz im Alphakanal beeinflussen kann.
Kurt Pfeifle 28.11.2014 18:26
quelle
4

ImageMagick hat keinen eingebauten Alpha-Farbalgorithmus. Fred Weinhaus hat die folgende Lösung gefunden, die fast die gleiche ist wie das Farb-zu-Alpha-Plugin von GIMP.

%Vor%     
dlemstra 18.10.2014 16:36
quelle