Kolophon

Ein Darkmode-Layout für die Seite

Kapitelinhalt: [  Überspringen ]

nach oben

Farb­invertierung und mathematische Hintergründe

Kapitelinhalt: [  Überspringen ]

Die Entscheidung für die hier beschriebene Umstellung eines gesamten Blogs auf zwei ver­schie­dene Layouts (dazu­kommen sollte ein kontrast­reiches hellig­keits­inver­tiertes Layout – weiße Schrift auf schwarzem Grund) hatte eher nicht­tech­nische Gründe; der Autor wollte sich und anderen auch ein vollständig „dunkles“ Layout (ein­schließ­lich der Illustrationen) anbieten. 

Im Fol­genden soll es daher um die Um­setzung dieses hellig­keits­inver­tierten Layouts für diese Internet­seite gehen – und dabei ins­be­son­dere um die Umwandlung der Bilder. 

nach oben

Um­setzung der Oszillo­skopen-Screen­shots

Schon bei der Ein­bin­dung von Oszillo­gramm-Screen­shots (eines Soft­ware-Oszillo­skops – helle Linien auf schwarzem Hinter­grund) in das helle „Standard“-Layout bestand die Not­wendig­keit, Bilder bei gleichen Far­ben in der Hellig­keit zu invertieren.  Dazu wurden zunächst die Kom­ple­men­tär­farben berechnet, indem die drei Farb­komponenten Rot, Grün und Blau per Matrizenmultiplikation durch ihre jeweiligen Kom­ple­men­tär­farben Cyan, Magenta und Gelb ersetzt werden.  Dieser Farb­tausch ist not­wendig, da bei der an­schließenden automatischen und „dummen“ Farb­negation (der RGB-Wert der inversen Farbe ist gleich 100% abzüglich des RGB-Wertes der Originalfarbe), die Farben ebenfalls wieder durch ihre Kom­ple­men­tär­farben ersetzt werden.

Dabei wurde die Farb­wieder­gabe bei der Berechnung Farb­invertierung durch die Matrizenmultiplikation quasi „über­steuert“ – die Kom­ple­men­tär­farben werden auf 150 % ihrer maximalen Hellig­keit aufgehellt.  Für RGB-Farben mit Farb­werten zwischen null und eins lässt sich der Vor­gang wie folgt mathe­matisch beschreiben (die Variablen r, g, und b stehen für die Rot-, Grün- und Blauanteile der Farbe): 

\( \begin{eqnarray} \left[ \begin{array}{ccc} r_{\textrm{kmpl.}} \\ g_{\textrm{kmpl.}} \\ b_{\textrm{kmpl.}} \end{array} \right] & = & \left[ \begin{array}{lll} 0 \!&\! 1,5 \!&\! 1,5 \\ 1,5 \!&\! 0 \!&\! 1,5 \\ 1,5 \!&\! 1,5 \!&\! 0 \\ \end{array} \right] \!\cdot\!\! \left[ \begin{array}{c} r_{\textrm{orig}} \\ g_{\textrm{orig}} \\ b_{\textrm{orig}} \end{array} \right] \\~\\ &&\textrm{Wenn}~~r_{\textrm{kmpl.}} >1 ~~~~ \leadsto{} ~~ r_{\textrm{kmpl.}} = 1\\ &&\textrm{Wenn}~~g_{\textrm{kmpl.}} >1 ~~~~ \leadsto{} ~~ g_{\textrm{kmpl.}} = 1\\ &&\textrm{Wenn}~~b_{\textrm{kmpl.}} >1 ~~~~ \leadsto{} ~~ b_{\textrm{kmpl.}} = 1 \\~\\ \left[ \begin{array}{ccc} r_{\textrm{inv.}} \\ g_{\textrm{inv.}} \\ b_{\textrm{inv.}} \end{array} \right] & = & \left[ \begin{array}{ccc} 1 \\ 1 \\ 1 \end{array} \right] - \left[ \begin{array}{ccc} r_{\textrm{kmpl.}} \\ g_{\textrm{kmpl.}} \\ b_{\textrm{kmpl.}} \end{array} \right] \tag{1}\end{eqnarray} \)

Durch die Über­steuerung werden auch nur die eher kräftigen „eindeutigen“ RGB-Farben (eindeutig Rot, Grün oder Blau) zu ebenso eindeutigen Far­ben im in­ver­tierten Bild umgerechnet – um den Preis, dass Grautöne und ins­be­son­dere die hellen CMY-Farben (Cyan, Magenta, Yellow – die Kom­ple­men­tär­farben zu den RGB-Farben bzw. die Misch­farben aus je zwei RGB-Farben) nach der Hellig­keits­invertierung zu dunkel werden (siehe auch die folgende Abbildung 1:)

SkizzeSkizze

Abb. 1: Be­rech­nete Paare aus der originalen Bild­farbe und be­rech­neter hellig­keits­inver­tierter Farbe – Umwandlung für die Os­zillo­skopen­screen­shots (ur­sprüng­lich hell auf schwarz) ent­sprechend Gleichung 2

Insbesondere das kräfige Gelb in den Screen­shots von Lissajous-Figuren wurde in dieser Hellig­keits­invertierung zu schwarz. 

Des­wegen wurde für das hellig­keits­invertierte Layout der gesamten Seite und aller anderen Abbildungen nach einer besseren Lösung gesucht, was auf die Suche nach einer besseren Kom­plen­tär­farben­matrix hinausläuft. 

nach oben

Zweiter Ansatz – Matrix­koeffizienten 0 und 1/2

Bei der In­ver­tierung der Illu­stra­tionen waren die An­forderungen anders – alle Farb­töne (und nicht nur weiß, rot, grün und blau) sollten in den schwarz­weiß­inver­tierten Bildern mit ähn­lichem Farb­ton und ähn­licher Sättigung wieder­ge­geben werden. 

Um hier nicht allzu sehr mit den existierenden Bildern herumprobieren zu müssen, wurde zunächst erst einmal versucht, eine Übersicht über die Bilder und die dort vorhandenen Farben und Farb­töne zu finden: 

Farben PSPICE-Diagramme: 

Im Schaltungs­simulations­programm PSPICE wurden zahl­reiche Dia­gramme (mit hellen Farben und schwarzem Hinter­grund) er­stellt, als Screen­shots mit dem Grafik­betrachter Irfan­View händisch farb­invertiert und gespeichert worden – die Far­ben in PSPICE waren so aus­ge­wählt worden, dass nach der Farb­invertierung sinn­volle Far­ben herauskamen: 

  • PSPICE­Rot“: (#aa0000“ durch Invertierung aus Cyan „#55ffff)
  • PSPICE­Grn“: (#00aa00“ durch Invertierung aus Magenta „#ff55ff)
  • PSPICE­Blau“: (#0000aa“ durch Invertierung aus Gelb: „#ffff55)
  • PSPICE­Lila“: (#aa00aa“ durch Invertierung aus Grün: „#55ff55)

Außer­dem gibt es noch eine grüne Hinter­grund­farbe „PSPICE­Gamma­Grn“ (#007b00), mit der in Schalt­plänen (weißer Hinter­grund) die in der Simulation ermittelten Spannungs­angaben hinter­legt sind.  Sie wurde nicht in negiert. 

Diese ersten vier Far­ben bilden den Anfang der Farb­leisten bzw. Vergleichs­paletten in den Abbildungen (siehe Abbildung 2 und Abbildung 3). 

Farben Oszillo­gramme Soft­ware-Oszillo­skop

Hier sind die Farben in den Screen­shots durch das oben beschriebene Script des Autors bereits in die Kom­ple­men­tär­farben umgerechnet und wieder negiert worden: 

  • Osci­Rot“: (#ff0000“ aus Rot: „#ff0000)
  • Osci­Grn“: (#006600“ aus Hellgrün: „#66ff00)
  • Osci­Linie“: (#81ea6f“ aus Dunkelgrün: „#0d5301“ – die Rasterlinien )

Diese drei Farben bilden den zweiten Abschnitt der Farb­leisten bzw. Vergleichs­paletten.  Die Graphen­farbe Gelb (in der Oszillo­skop-Soft­ware für die Lissajous-Figuren) war bei der „Über­steuerung“ der Um­rechnung bzw. den Matrix­koeffizienten 1,5 (siehe oben bzw. in Gleichung 1) ohnehin zu schwarz geworden. 

Andere Farben: 

Schließ­lich wurden aus einer Liste aller bereits erstellten Bilder (etwa 400 reine Schwarz­weiß­bilder; etwa 800 überwiegende Schwarz­weiß­bilder) einige typische Bilder aus­ge­wählt, um ebenso typische Far­ben zu entnehmen.  Für diese Far­ben (bzw. deren RGB-Werte) wurden in EXCEL die Farb­töne berechnet und die Far­ben nach Farb­ton sortiert.

Der dritte und größte Ab­schnitt in der Farbleiste enthält diese 26 Farben, in denen sich mehrere Unter­gruppe finden lassen: 

  • In zwei von der Firma AMT übersetzten Artikeln finden sich die Farben „AMT­Gruen“ und „AMT­Lila“ – hier verlangt insbesondere das satte Lila nach einer sorgfältigen Verarbeitung. 

  • Weiterhin wurde eine Farbe wie „Dunkel­Rot“ allgemein zur Betonung eigentlich schwarzer Linien verwendet. 

  • Die EXCEL-Farben (Excel­Blau“, „Excel­Gruen“ und „Excel­Rot) für die normalen x-y-Diagramme sowie die Farben (Balken­Blau“, „Balken­Gelb“, „Balken­Gruen“ und „Balken­Rot) für EXCEL-Balken­diagramme. 

  • In den mit Corel­DRAW gezeichneten Platinen­Layouts finden sich die Farben „Kupfer­Gelb“ sowie „Layout­Braun“, „LayoutC­Gelb“, „Layout­Gruen“, „Layout­Masse“, „Layout­Orange“ und „Layout­Rot“. 

  • Weiterhin wurden, insbesondere für die Weiterverarbeitung der Schaltpläne, im Bildbearbeitungsprogramm PhotoPaint einige Vorlagen für Hinter­grund­farben festgelegt (BG­Blau“, „BG­Gelb“, „BG­Gruen“ und „BG­Sattgelb). 

  • in den Schaltpläne eines Vermonaverstärker wurden vom Autor noch andere Hinter­grund­farben eingesetzt – „Vermona­BG­Grn“, „Vermona­BG­Rose“ und „Vermona­BG­Lila“. 

Danach wurden für jeden Farb­ton ent­sprechend der folgenden Gleichung die Kom­ple­men­tär­farbe und dann die in­ver­tierte Farbe berechnet: 

\( \begin{eqnarray} \left[ \begin{array}{ccc} r_{\textrm{kmpl.}} \\ g_{\textrm{kmpl.}} \\ b_{\textrm{kmpl.}} \end{array} \right] & = & \frac{1}{2}\!\cdot\! \left[ \begin{array}{lll} 0 \!&\! 1 \!&\! 1 \\ 1 \!&\! 0 \!&\! 1 \\ 1 \!&\! 1 \!&\! 0 \\ \end{array} \right] \!\cdot\! \left[ \begin{array}{c} r_{\textrm{orig}} \\ g_{\textrm{orig}} \\ b_{\textrm{orig}} \end{array} \right] \\~\\ & = & \left[ \begin{array}{lll} 0 \!&\! 0{,}5 \!&\! 0{,}5 \\ 0{,}5 \!&\! 0 \!&\! 0{,}5 \\ 0{,}5 \!&\! 0{,}5 \!&\! 0 \\ \end{array} \right] \!\cdot\! \left[ \begin{array}{c} r_{\textrm{orig}} \\ g_{\textrm{orig}} \\ b_{\textrm{orig}} \end{array} \right] \\~\\ \left[ \begin{array}{ccc} r_{\textrm{inv.}} \\ g_{\textrm{inv.}} \\ b_{\textrm{inv.}} \end{array} \right] & = & \left[ \begin{array}{ccc} 1 \\ 1 \\ 1 \end{array} \right] - \left[ \begin{array}{ccc} r_{\textrm{kmpl.}} \\ g_{\textrm{kmpl.}} \\ b_{\textrm{kmpl.}} \end{array} \right] \tag{2}\end{eqnarray} \)

(Der Koeffizient 1/2 anstelle von eins war notwendig geworden, damit die hellen RGB-„Misch­farben“ wie Gelb oder Magenta nicht „über­steuern“ und die inversen Far­ben dann zu dunkel werden.). 

Diese Matrix zur Ermittlung der Kom­plemen­tär­farben wird im Folgenden zum besseren Ver­ständ­nis in eine Differenz-Matrix (für die Ab­leitung der Kom­ple­men­tär­farbe) und einen „Gleich­anteil“ zerlegt: 

\( \begin{eqnarray} \left[ \begin{array}{lll} 0 \!&\! 0{,}5 \!&\! 0{,}5 \\ 0{,}5 \!&\! 0 \!&\! 0{,}5 \\ 0{,}5 \!&\! 0{,}5 \!&\! 0 \\ \end{array} \right] & = & \frac{1}{4}\!\cdot\! \left[ \begin{array}{rrr} -1 & 1 & 1 \\ 1 & -1 & 1 \\ 1 & 1 & -1 \\ \end{array} \right] + \frac{1}{4}\!\cdot\! \left[ \begin{array}{ccc} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \\ \end{array} \right]\!\!\!\! \tag{3}\end{eqnarray} \)

Es zeigt sich, dass der „Gleich­anteil“ bei der Bestimmung der Kom­ple­men­tär­farbe relativ hoch ist, denn der Ko­effizient der Differenz-Ma­trix ist genauso groß wie der vor der Einer­matrix, die der Farbe einen auf­hellenden Grau­wert hinzufügt (was mög­licher­weise in der nach­folgenden Farb­negation der Pastell­farben zu dunkleren Far­ben führt). 

Es gibt also durchaus noch „Optimierungs­bedarf“. 

Doch zunächst einmal sollen die genannten ausgewählten Farben und die daraus errechneten inversen Far­ben sichtbar gemacht werden – in der folgenden Abbildung 2 werden sie nebeneinander dargestellt.  (Diese Farb-Vergleichs-Bilder wurden mit EXCEL gerechnet, in eine Pixmap eingetragen, die dann als GIF-Datei weiterverarbeitet wurde, um hier dargestellt werden zu können.

SkizzeSkizze

Abb. 2: Be­rech­nete Paare aus (gefundener) Grafik­farbe und be­rech­ne­ter hellig­keits­inver­tierter Farbe – Umwandlung ent­sprechend Gleichung 2

Das ist schon deut­lich besser.  Aller­dings sind die hellig­keits­inver­tierten vorher kräftigen Far­ben in den ersten beiden Ab­schnitten (für PSPICE-Dia­gramme und Oszillo­gramme) ein wenig blass; immerhin sind das Far­ben für Linien, nicht für Flächen.  Im dritten Ab­schnitt fallen die hellen und zarteren bzw. Pastell­farben auf (im dritten Abschnitt: Grau-Rosé als fünfte von links, der erste und vierte Grünton rechts neben den gelben Flächen sowie Himmel­blau als vierte Farbe von rechts), die im in­ver­tierten Farb­ton im Hinter­grund verschwinden. 

nach oben

Dritter Ansatz – Matrix­koeffizienten −1/3 und 2/3

Dem zweiten Ansatz lag die Über­legung zugrunde, dass die blasseren hellig­keits­invertierten Farben bzw. der Ver­lust an Farb­kontrast bei den berechneten Kom­ple­men­tär­farben ver­ringert werden könnte, wenn man in der Matrix negative Elemente zulässt. 

Dabei muss aller­dings sicher­gestellt werden, dass die Multi­plikation einer grauen Farbe mit der Kom­ple­men­tär­farben­matrix auch wieder zu der gleichen grauen Farbe führt, was darauf hinausläuft, dass die Summe der drei Elemente einer Zeile der Matrix gleich eins sein muss: 

\( \begin{eqnarray} r_{\textrm{grau}} & = & g_{\textrm{grau}} = b_{\textrm{grau}} = x_{\textrm{grau}} \\~\\ \left[ \begin{array}{ccc} x_{\textrm{grau}} \\ x_{\textrm{grau}} \\ x_{\textrm{grau}} \end{array} \right] & = & \left[ \begin{array}{ccc} A \!&\! B \!&\! B \\ B \!&\! A \!&\! B \\ B \!&\! B \!&\! A \\ \end{array} \right] \!\!\cdot\!\! \left[ \begin{array}{c} x_{\textrm{grau}} \\ x_{\textrm{grau}} \\ x_{\textrm{grau}} \end{array} \right] \\~\\ x_{\textrm{grau}} & = & x_{\textrm{grau}}\!\cdot\! (A + 2B) \\~\\ 1 & = & A + 2B \tag{4}\end{eqnarray} \)

Auf­bauend auf dieser Über­legung bzw. Gleichung wurden die Koeffizienten A und B (mehr aus der Lamäng heraus) auf −1/3 und 2/3 festgesetzt und es wurde an­schließend mit der in der folgenden Gleichung 5 dar­ge­stellten Kom­ple­men­tär­farben­matrix ge­arbeitet: 

\( \begin{eqnarray} \left[ \begin{array}{ccc} r_{\textrm{kmpl.}} \\ g_{\textrm{kmpl.}} \\ b_{\textrm{kmpl.}} \end{array} \right] & = & \left[ \begin{array}{rrr} -\cfrac{1}{3} \!&\! \cfrac{2}{3} \!&\! \cfrac{2}{3} \\ \cfrac{2}{3} \!&\!-\cfrac{1}{3} \!&\! \cfrac{2}{3} \\ \cfrac{2}{3} \!&\! \cfrac{2}{3} \!&\!-\cfrac{1}{3} \\ \end{array} \right] \!\cdot\! \left[ \begin{array}{c} r_{\textrm{orig}} \\ g_{\textrm{orig}} \\ b_{\textrm{orig}} \end{array} \right] \\~\\ \left[ \begin{array}{ccc} r_{\textrm{inv.}} \\ g_{\textrm{inv.}} \\ b_{\textrm{inv.}} \end{array} \right] & = & \left[ \begin{array}{ccc} 1 \\ 1 \\ 1 \end{array} \right] - \left[ \begin{array}{ccc} r_{\textrm{kmpl.}} \\ g_{\textrm{kmpl.}} \\ b_{\textrm{kmpl.}} \end{array} \right] \tag{5}\end{eqnarray} \)

Die Zerlegung der Kom­plemen­tär­farben­matrix in Differenz­matrix und „Gleich­anteil“: 

\( \begin{eqnarray} \left[ \begin{array}{rrr} -\cfrac{1}{3} \!&\! \cfrac{2}{3} \!&\! \cfrac{2}{3} \\ \cfrac{2}{3} \!&\!-\cfrac{1}{3} \!&\! \cfrac{2}{3} \\ \cfrac{2}{3} \!&\! \cfrac{2}{3} \!&\!-\cfrac{1}{3} \\ \end{array} \right] & = & \frac{1}{2}\!\cdot\! \left[ \begin{array}{rrr} -1 \!&\! 1 \!&\! 1 \\ 1 \!&\!-1 \!&\! 1 \\ 1 \!&\! 1 \!&\!-1 \\ \end{array} \right] + \frac{1}{6}\!\cdot\! \left[ \begin{array}{rrr} 1 \!&\! 1 \!&\! 1 \\ 1 \!&\! 1 \!&\! 1 \\ 1 \!&\! 1 \!&\! 1 \\ \end{array} \right] \tag{6}\end{eqnarray} \)

Tatsächlich hat sich durch die negativen Koeffizienten an der Matrix­dia­gonale der Anteil der Einer­matrix (der Grau­anteil) an der Kom­ple­mentär­farben­matrix deutlich verringert. 

Es scheint auch, dass die In­ver­tierung der Pastell­farben mit dieser Kom­ple­mentär­farben­matrix ein wenig besser gelungen ist – siehe die folgende Abbildung 3

SkizzeSkizze

Abb. 3: Berechnete Paare aus (gefundener) Grafik­farbe und berechneter hellig­keits­inver­tierter Kom­ple­mentär­farbe – Umwandlung ent­sprechend Gleichung 5

nach oben

Versuch einer Nach­berechnung

Im An­schluss wurde dann doch noch einmal versucht, die beiden Para­meter für die Kom­ple­mentär­farben­matrix, die Koeffizienten A auf der Matrix­dia­go­nalen und rest­lichen die Koeffizienten B, mathe­matisch ab­zu­leiten. 

Für A und B gibt es dabei folgende Vorgabe: 

\( \begin{eqnarray} \left[ \begin{array}{ccc} r_{\textrm{kmpl.}} \\ g_{\textrm{kmpl.}} \\ b_{\textrm{kmpl.}} \end{array} \right] & = & \left[ \begin{array}{ccc} A & B & B \\ B & A & B \\ B & B & A \\ \end{array} \right] \!\!\cdot\!\! \left[ \begin{array}{c} r_{\textrm{orig}} \\ g_{\textrm{orig}} \\ b_{\textrm{orig}} \end{array} \right] \tag{7}\end{eqnarray} \)

Die Werte für A und B müssen dabei so gewählt werden, dass zwei Bedingungen erfüllt werden. 

  • Wie schon oben in Gleichung 4 abgeleitet, muss die Summe der Elemente einer Zeile oder Spalte der Kom­ple­mentär­farben­matrix gleich eins sein, damit die Kom­ple­mentär­farbe von Grau das gleiche Grau ist: 

    \( \begin{eqnarray} 1 & = & A + 2B ~~~~ \textrm{bzw.} \\~\\ A & = & 1 - 2B ~~~~ \textrm{oder} \\~\\ B & = & \frac{1-A}{2} \tag{8}\end{eqnarray} \)

  • Die (berechnete) Kom­ple­men­tär­farbe der (berechneten) Kom­ple­men­tär­farbe sollte wider die Original­farbe sein. 

    \( \begin{eqnarray} \left[ \begin{array}{ccc} A & B & B \\ B & A & B \\ B & B & A \\ \end{array} \right] \!\!\cdot\!\! \left[ \begin{array}{ccc} A & B & B \\ B & A & B \\ B & B & A \\ \end{array} \right] & = & \left[ \begin{array}{ccc} A & B & B \\ B & A & B \\ B & B & A \\ \end{array} \right]^2\!\!\! \\~\\ & = & \left[ \begin{array}{ccc} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{array} \right] \tag{9}\end{eqnarray} \)

Das Ganze wird jetzt so auseinanderklamüsert, dass sich die notwendigen Bedingungen für A und B erkennen lassen: 

\( \begin{eqnarray} \left[ \begin{array}{ccc} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{array} \right] & = & \left[ \begin{array}{ccc} A & B & B \\ B & A & B \\ B & B & A \\ \end{array} \right]^2 \\~\\ \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{array} \right] & = & \left[ \begin{array}{ccc} A^2 + 2B^2 & 2AB + B^2 & 2AB + B^2 \\ 2AB + B^2 & 2B^2 + A^2 & B^2 + 2AB \\ 2AB + B^2 & B^2 + 2AB & 2B^2 + A^2 \\ \end{array} \right] \\~\\ 1 & = & A^2 + 2B^2 \\~\\ 0 & = & B^2 + 2AB \tag{10}\end{eqnarray} \)

Begonnen wird mit der Ableitung von A, wobei die erste Bedingung (siehe Gleichung 8) in die erste Ergebnisgleichung von Gleichung 10 eingesetzt wird.  Die nun abgeleitete quadratische Gleichung hat zwei Lösungen für A: 

\( \begin{eqnarray} B & = & \frac{1-A}{2} \\~\\ 1 & = & A^2 + 2B^2 \\~\\ & = & A^2 + 2\left(\frac{1-A}{2}\right)^2 \\~\\ & = & \frac{4A^2 + 2 - 4A + 2A^2 }{4} \\~\\ 2 & = & 3A^2 - 2A + 1 \\~\\ 0 & = & 3A^2 - 2A - 1 \\~\\ & = & A^2 - \frac{2}{3}A - \frac{1}{3} \\~\\ A_{1,2} & = & \frac{1}{3}\pm\sqrt{ \frac{1}{9} +\frac{1}{3} } \\~\\ & = & \frac{1}{3}\pm\sqrt{ \frac{1}{9} +\frac{3}{9} } \\~\\ & = & \frac{1}{3}\pm\frac{2}{3} \\~\\ A_1 & = & 1 \\ A_2 & = & -\frac{1}{3} \tag{11}\end{eqnarray} \)

Jetzt kann über die letzte Gleichung aus Gleichung 10 der Wert von B ermittelt werden – wobei es auch hier zwei Lösungen gibt.  Neben der offensichtlichen Lösung B1 = 0 (die mit der wegen der Bedingung A + 2B = 1 mit der Lösung A1 = 1 kor­res­pondiert) ergibt sich aus gleichem Grund die zweite Lösung B2 = 2/3: 

\( \begin{eqnarray} 0 & = & B_2 + 2A_2 \\~\\ B_2 & = & - 2A_2 = - 2\cdot{} \!\! \left(\! - \frac{1}{3} \right) = \frac{2}{3} \tag{12}\end{eqnarray} \)

Die beiden gefundenen Wertepaare (A1 = 1  und B1 = 0  sowie A2 = −1/3  und B2 = 2/3) können jetzt in einer Art Gegenprobe untersucht werden. 

Die Überprüfung der ersten Lösung (A1 = 1  und B1 = 0 ) ist schon ein wenig trivial, die Lösung für den angestrebten Zweck einer Kom­ple­mentär­farben­matrix nicht zu verwenden. 

\( \begin{eqnarray} \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{array} \right]^2 & = & \left[ \begin{array}{ccc} (1\!+\!0\!+\!0) & (0\!+\!0\!+\!0) & (0\!+\!0\!+\!0) \\ (0\!+\!0\!+\!0) & (1\!+\!0\!+\!0) & (0\!+\!0\!+\!0) \\ (0\!+\!0\!+\!0) & (0\!+\!0\!+\!0) & (1\!+\!0\!+\!0) \\ \end{array} \right] \\~\\ & = & \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{array} \right]~~~~\textrm{und} \tag{13}\end{eqnarray} \)

Die Überprüfung der zweiten Lösung (A2 = −1/3  und B2 = 2/3) ist erfolgreich – im Übrigen han­delt es sich hier um den zweiten, „intuitiv gefundenen“ Ansatz: 

\( \begin{eqnarray} \left[ \begin{array}{rrr} -\cfrac{1}{3} \!&\! \cfrac{2}{3} \!&\! \cfrac{2}{3} \\ \cfrac{2}{3} \!&\!-\cfrac{1}{3} \!&\! \cfrac{2}{3} \\ \cfrac{2}{3} \!&\! \cfrac{2}{3} \!&\!-\cfrac{1}{3} \\ \end{array} \right]^2\!\! & = & \left( \frac{1}{3} \right)^{\!2} \!\cdot\! \left[ \begin{array}{rrr} -1 \!&\! 2 \!&\! 2 \\ 2 \!&\!-1 \!&\! 2 \\ 2 \!&\! 2 \!&\!-1 \\ \end{array} \right]^2 \\~\\ & = & \frac{1}{9} \left[ \begin{array}{rrr} 1\!+\!4\!+\!4 &\!\! -2\!-\!2\!+\!4 &\!\! -2\!+\!4\!-\!2 \\ -2\!-\!2\!+\!4 &\!\! 1\!+\!4\!+\!4 &\!\! 4\!-\!2\!-\!2 \\ -2\!+\!4\!-\!2 &\!\! 4\!-\!2\!-\!2 &\!\! 1\!+\!4\!+\!4 \\ \end{array} \right]\!\!\!\!\!\!\!\! \\~\\ & = & \left[ \begin{array}{rrr} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{array} \right] \!\!\!\!\tag{14}\end{eqnarray} \)

Der genannte Test wird auch noch für die erste Kom­plen­tär­farben­ mit den Elementen A1 = 0  und B1 = 1/2  durchgeführt.  Die erste Bedingung aus Gleichung 8 (1 = A + 2B) wird auch hier erfüllt. 

Bei der doppelten Umrechnung in die Kom­ple­mentärfarbe entsteht nicht die gleiche Farbe – die neue Farbe wird möglicherweise dunkler (der kleine Multiplikator 1/4), aber auf jeden Fall blasser – der Anteil der Einermatrix ist relativ groß: 

\( \begin{eqnarray} \left[ \begin{array}{rrr} 0 & \cfrac{1}{2} & \cfrac{1}{2} \\ \cfrac{1}{2} & 0 & \cfrac{1}{2} \\ \cfrac{1}{2} & \cfrac{1}{2} & 0 \\ \end{array} \right]^2\!\! & = & \left( \frac{1}{2} \right)^2 \!\cdot\! \left[ \begin{array}{rrr} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \\ \end{array} \right]^2 \\~\\ & = & \frac{1}{4}\!\cdot\! \left[ \begin{array}{rrr} 0\!+\!1\!+\!1 & 0\!+\!0\!+\!1 & 0\!+\!1\!+\!0 \\ 0\!+\!0\!+\!1 & 0\!+\!1\!+\!1 & 1\!+\!0\!+\!0 \\ 0\!+\!1\!+\!0 & 1\!+\!0\!+\!0 & 0\!+\!1\!+\!1 \\ \end{array} \right]\!\!\!\! \\~\\ & = & \frac{1}{4}\!\cdot\! \left[ \begin{array}{rrr} 2 & 1 & 1 \\ 1 & 2 & 1 \\ 1 & 1 & 2 \\ \end{array} \right] \\~\\ & = & \frac{1}{4}\!\cdot\! \left[ \begin{array}{rrr} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{array} \right] + \frac{1}{4}\!\cdot\! \left[ \begin{array}{rrr} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \\ \end{array} \right] \!\!\!\!\tag{15}\end{eqnarray} \)

Somit erfüllt erste gefundene Matrix die Bedingung einer doppelten Um­wandlung in eine dann identische Kom­ple­men­tär­farbe nicht. 

nach oben

Abschluss mit Tabelle

Nach all der Theorie noch eine tabellarische Dar­stellung der Re­sul­tate beider Farb­inver­tierungen – siehe dazu die folgende Tabelle 1

Tabelle 1:  Liste der ver­wendeten Far­ben und der hellig­keits­inver­tierten Far­ben – In­ver­tierung mit den zwei ver­schiedenen Matriken. 
Farbe mit
Hinter­grund
hell
Ansatz 2 –
invertiert mit:
A = 0
B = 0,5
Ansatz 3 –
invertiert mit:
A = −0,36
B = 0,72
PSPICE­Rot
Text ■  #aa0000
Text ■  #ffaaaaText ■  #ff8e8e
PSPICE­Grn
Text ■  #00aa00
Text ■  #aaffaaText ■  #8eff8e
PSPICE­Blau
Text ■  #0000aa
Text ■  #aaaaffText ■  #8e8eff
PSPICE­Lila
Text ■  #aa00aa
Text ■  #aa55aaText ■  #c61cc6
PSPICE­GammaGrn
Text ■  #007b00
Text ■  #c1ffc1Text ■  #adffad
OsciRot
Text ■  #ff0000
Text ■  #ff7f7fText ■  #ff5555
OsciGrn
Text ■  #006600
Text ■  #ccffccText ■  #bbffbb
OsciLinie
Text ■  #81ea6f
Text ■  #528749Text ■  #44ad32
AMTGruen
Text ■  #003f00
Text ■  #dfffdfText ■  #d5ffd5
AMTLila
Text ■  #f400f4
Text ■  #850b85Text ■  #ae00ae
DunkelRot
Text ■  #710404
Text ■  #fbc4c4Text ■  #ffb2b2
ExcelBlau
Text ■  #1f497d
Text ■  #9cb1cbText ■  #85afe3
ExcelGruen
Text ■  #4f6329
Text ■  #b9c3a6Text ■  #bcd096
ExcelRot
Text ■  #c10000
Text ■  #ff9e9eText ■  #ff7e7e
Balken­Blau
Text ■  #1f497d
Text ■  #9cb1cbText ■  #85afe3
Balken­Gelb
Text ■  #f4f400
Text ■  #85850bText ■  #aeae00
Balken­Gruen
Text ■  #92d050
Text ■  #6f8e4eText ■  #70ae2e
Balken­Rot
Text ■  #c00000
Text ■  #ff9f9fText ■  #ff7f7f
KupferGelb
Text ■  #f4c300
Text ■  #9d8523Text ■  #ce9d00
Layout­Braun
Text ■  #885041
Text ■  #b69a93Text ■  #cc9485
Layout­CGelb
Text ■  #f4ea00
Text ■  #8a8510Text ■  #b4aa00
Layout­Gruen
Text ■  #018d38
Text ■  #9ce2b8Text ■  #7cffb3
Layout­Masse
Text ■  #018bd3
Text ■  #5095b9Text ■  #16a0e8
Layout­Orange
Text ■  #dd7216
Text ■  #bb8557Text ■  #ee8327
Layout­Rot
Text ■  #dd221a
Text ■  #e1837fText ■  #ff665e
BGBlau
Text ■  #b3d3f2
Text ■  #1c2c3cText ■  #0d2d4c
BGGelb
Text ■  #efd482
Text ■  #54461dText ■  #6b5000
BGGruen
Text ■  #d7f0bd
Text ■  #28351bText ■  #29420f
BGSattgelb
Text ■  #f4d582
Text ■  #53441aText ■  #6c4d00
Vermona­BGGrn
Text ■  #d4d4bb
Text ■  #37372bText ■  #3c3c23
Vermona­BGRose
Text ■  #d4bbbb
Text ■  #443737Text ■  #4c3333
Vermona­BGLila
Text ■  #bbbad4
Text ■  #383744Text ■  #34334d

Es muss darauf hin­gewiesen werden, dass die „BG“- und die „VermonaBG“-Farben flächige Hinter­grund­farben sind – diese Farben dürfen blass sein.  Ins­ge­samt be­stä­tigt sich hier der Ein­druck, dass die zweite Kom­ple­men­tär­farben­matrix für die Farb­inver­tierung besser ge­eig­net ist. 

So gesehen kann also begonnen werden, die Pro­gramm­er­weiterungen für die Farb­inver­tierung der tech­nischen Illu­stra­tionen auf dieser Seite zu er­stellen. 

Nach­trag Matrix­parameter

Bei der praktischen Um­setzung der Lösung wurden die in gezeigten Para­meter noch ein­mal ver­ändert – es ging darum, auch bei der Invertierung von Bildern mit einer Hinter­grund­farbe von etwa 95 % weiß (#f4f4f4) Bilder mit voll­ständig schwarzem Hinter­grund zu er­halten.  Aus diesem Grund wurden die Para­meter der Matrix nach Kopf­rechnen und Probieren auf die Werte −0,36 und 0,7 erhöht.  Mit diesen neuen Matrix­para­metern ergibt sich für die Um­wandlung der Hinter­grund­farbe „#f4f4f4“ bzw. „rgb(244,244,244)“: 

\( \begin{eqnarray} \left[ \begin{array}{l} r_{\textrm{BG,inv}} \\ g_{\textrm{BG,inv}} \\ b_{\textrm{BG,inv}} \end{array} \right] & = & \left[ \begin{array}{c} 1 \\ 1 \\ 1 \end{array} \right] - \left[ \begin{array}{rrr} -0{,}36 & 0{,}72 & 0{,}72 \\ 0{,}72 & -0{,}36 & 0{,}72 \\ 0{,}72 & 0{,}72 & -0{,}36 \\ \end{array} \right] \!\!\cdot\!\! \left[ \begin{array}{c} r_{\textrm{BG,orig}} \\ g_{\textrm{BG,orig}} \\ b_{\textrm{BG,orig}} \end{array} \right]\!\!\!\!\!\!\!\!\!\!\!\!\! \\~\\ & = & \left[ \begin{array}{c} 1 \\ 1 \\ 1 \end{array} \right] - \left[ \begin{array}{rrr} -0{,}36 & 0{,}72 & 0{,}72 \\ 0{,}72 & -0{,}36 & 0{,}72 \\ 0{,}72 & 0{,}72 & -0{,}36 \\ \end{array} \right] \!\!\cdot\!\! \left[ \begin{array}{c} \cfrac{244}{255} \\ \cfrac{244}{255} \\ \cfrac{244}{255} \end{array} \right] \\~\\ & = & \left[ \begin{array}{c} 1 \\ 1 \\ 1 \end{array} \right] - \cfrac{244}{255} \!\cdot\!\! \left[ \begin{array}{rrr} -0{,}36 + 0{,}72 + 0{,}72 \\ 0{,}72 - 0{,}36 + 0{,}72 \\ 0{,}72 + 0{,}72 - 0{,}36 \\ \end{array} \right] \\~\\ & = & \left[ \begin{array}{c} 1 \\ 1 \\ 1 \end{array} \right] - \cfrac{244\cdot{}1{,}08}{255} \!\cdot\!\! \left[ \begin{array}{rrr} 1 \\ 1 \\ 1 \\ \end{array} \right] \\~\\ & = & \left[ \begin{array}{c} 1 \\ 1 \\ 1 \end{array} \right] \cdot{} \left(1 - \frac{263{,}52}{255} \right) \\~\\ & = & \left[ \begin{array}{c} -0{,}0334 \\ -0{,}0334 \\ -0{,}0334 \end{array} \right] \tag{16}\end{eqnarray} \)

Somit ist „ein sattes Schwarz mit leich­ter Über­steuerung“ als Hinter­grund­farbe sicher­ge­stellt. 

Nach­trag Farb­töne

Neben der technischen Treff­sicher­heit der Farb­ersetzungen bei der In­ver­tierung muss natür­lich noch beachtet werden, dass sich Farben nicht nur durch Para­meter wie Farb­ton, Sättigung und Hellig­keit, sondern auch durch eine gewisse An­mutung auszeichnen, die bei der Hell-Dunkel-Umwandlung verändert werden kann – hier sind bei dem beschriebenen Ver­fahren durch­aus Schwächen auf­ge­fallen. 

So ent­standen beispiels­weise aus einem durchaus kräftigen dunk­len Rot (in den obigen Tabellen die Farben „Dunkel­Rot“, „Balken­Rot“ oder „Excel­Rot) Farb­töne, die man durch­aus als „Schweinchen­rosa“ bezeichnen könnte.  Glück­licher­weise werden mit diesen Farben eher Linien als Flächen hervor­gehoben …

Aller­dings hat dieses Phänomen durchaus einen mathe­matischen Hinter­grund – aus reinen Farben (rot, grün oder blau) unter­schied­licher Hellig­keit werden „unreine“ hellig­keits­inver­tierte Farben, wobei die Sättigung der hellig­keits­inver­tierten Farbe von der Hellig­keit der Ausgangs­farbe ab­hängt. 

Hat beispielsweise eine rein rote Farbe die Hellig­keit rorig = a, so entsteht bei der Hellig­keits­invertierung eine Farbe mit maximalem An­teil rot und mit An­teilen der Farben grün und blau, deren Hellig­keiten (und damit die „Unreinheit“ der berechneten Farbe) mit größerem a zunehmen: 

\( \begin{eqnarray} r_{\textrm{orig}} & = & a \\ g_{\textrm{orig}} & = & 0 \\ b_{\textrm{orig}} & = & 0 \\~\\ \left[ \begin{array}{l} r_{\textrm{inv}} \\ g_{\textrm{inv}} \\ b_{\textrm{inv}} \end{array} \right] & = & \left[ \begin{array}{c} 1 \\ 1 \\ 1 \end{array} \right] - \left[ \begin{array}{rrr} -0{,}36 & 0{,}72 & 0{,}72 \\ 0{,}72 & -0{,}36 & 0{,}72 \\ 0{,}72 & 0{,}72 & -0{,}36 \\ \end{array} \right] \!\!\cdot\!\! \left[ \begin{array}{c} r_{\textrm{orig}} \\ b_{\textrm{orig}} \\ g_{\textrm{orig}} \end{array} \right] \\~\\ & = & \left[ \begin{array}{c} 1 \\ 1 \\ 1 \end{array} \right] - \left[ \begin{array}{rrr} -0{,}36 & 0{,}72 & 0{,}72 \\ 0{,}72 & -0{,}36 & 0{,}72 \\ 0{,}72 & 0{,}72 & -0{,}36 \\ \end{array} \right] \!\!\cdot\!\! \left[ \begin{array}{c} a \\ 0 \\ 0 \end{array} \right] \\~\\ & = & \left[ \begin{array}{c} 1 \\ 1 \\ 1 \end{array} \right] - \left[ \begin{array}{rrr} -0 + 0 + 0 \\ 0{,}72\cdot{}a - 0 + 0 \\ 0{,}72\cdot{}a + 0 - 0 \\ \end{array} \right] \\~\\ & = & \left[ \begin{array}{ccc} 1 \\ (1-0{,}72)\cdot{}a\\ (1-0{,}72)\cdot{}a\\ \end{array} \right] = \left[ \begin{array}{ccc} 1 \\ 0{,}28\cdot{}a\\ 0{,}28\cdot{}a\\ \end{array} \right] \tag{17}\end{eqnarray} \)

Dieses Problem wurde aber erst nach der Umwandlung der Bilder deutlich. 

Um das Ganze ab­zu­schließen:  Das „Schweinchen­rosa-Problem“ ist ein wenig lästig, recht­fertigt aber z. Z. weder die Entscheidung, die Er­stellung der Negativ­bilder zu unter­lassen (und in einer Seite mit schwarzem Hinter­grund die originalen Bilder mit weißem Hinter­grund zu ver­wenden), noch den Auf­wand, die ganze Bild­bearbeitung bzw. das ent­sprechenden Script neu zu er­stellen, zumal es nach Kennt­nis des Autors im verwendeten Programm Imagemagick keinen besseren An­satz zu einer einigermaßen „farb­echten“ Hellig­keits­invertierung gibt, mit dem diese Fehler behoben werden könnten. 

Praktische Umwandlung der Bilder

Kapitelinhalt: [  Überspringen ]

Umwandlung und Neben­arbeiten

Nach der Theorie nun zur praktischen Arbeit.  Die Um­wandlung der vorhandenen Bilder zog sich dann doch eine Weile hin, weil die insge­samt über 1500 Bilder einzeln oder in den Artikeln durch­gesehen und unter Um­ständen ver­ändert werden mussten.  Diese Ver­änderung betrafen in erster Linie die Vignetten­bilder aus den Artikel-Teasern, sowie alle Foto­grafien und / oder JPG-Bilder. 

Dazu kamen verschiedene mit Corel­DRAW ge­zeichneten Schalt­pläne und Schalt­skizzen – hier mussten regel­mäßig Schriften ver­größert und Linien ver­breitert werden, was auf ein weiteres Prob­lem der Hellig­keits­inver­tierung hin­weist – Details sind entweder zu blass oder werden beim Hervorheben der Kontraste “überstrahlt“. 

Schließlich konnten einige Bilder nicht sinnvoll hellig­keits­inver­tiert werden (z. B. Fotos) – u. U. wurden sie dann für das dunkle Layout mit einem Rand versehen. 

Zukünftige TODOs

Bei der Be­trachtung der umgerechneten Bilder – ins­be­son­dere in der in­ver­tierten Seite – ist die unter­schied­liche Dicke dünner Linien auf­ge­fallen – die Illustrationen wirken dadurch schwach, blass und allzu filigran.  Das kann auch daran liegen, dass die Linien­breite nicht deutlich größer ist als die Pixel­breite und die Linien beim Herunter­skalieren der Bilder nicht hundert­prozentig schwarz (in der Standard-Darstellung) oder hundert­prozentig weiß (in der inverse Darstellung) sind. 

Sollen die Bilder nicht (mit breiteren Linien und / oder größeren Schriften) neu gezeichnet werden oder würde das nicht helfen („zu viel Zeich­nung“ pro Bild), so kann hier nur mit Gamma­kurven oder S-för­migen Gradations­kurven ge­arbeitet werden, die die halb­dunklen Grau­töne der Linien ent­sprechend nach­dunkeln und die Linien dadurch in beiden Dar­stellungen etwas fetter er­scheinen lassen. 

Bei einem solchen Nach­dunkeln ist aber unter Um­ständen mit Ver­lusten bei der Dar­stellung von Details (empfind­lich sind hier beispiels­weise Indizes) zu rech­nen, was eine automatische Anwendung auf alle Bilder ausschließt. 

Also viel Handarbeit bzw. ein TODO der Sorte „irgendwann“ …

Computer­technische Um­setzung

Kapitelinhalt: [  Überspringen ]

Bildumwandlung mit Python und Imagemagick

Bei der praktischen Erstellung der hellig­keits­inver­tierten Bilder hat der Autor wenig Neuland beschritten – die schon für die Erstellung verschieden großer Bilder (für das „Sourceset“-Feature der Browser) benutzten Werkzeuge Python und Imagemagick fanden weiterhin Verwendung. 

Konkret wurde ein Python-Script, dass das Kommando­zeilen­werkzeug Image­magick steuert, um die ent­sprechende Funk­tionali­tät, hellig­keits­inver­tierte Bilder zu er­zeugen, „auf­ge­bohrt“.  Die in­ver­tierten Bilder er­halten, im Unter­schied zu den nicht in­ver­tierten, einen zusätz­lichen Datei­namen­suffix „_invers“. 

Weiter­hin wurde die JSON-Tabelle „__bilder­liste.json“ (mit In­for­ma­tionen über die einzelnen Bilder) um eine Spalte „invJob“ ergänzt – hier wird ein­ge­tragen, ob die farb­inver­tierte Ver­sion des Bildes er­zeugt werden soll, das Bild schon händisch hellig­keits­inver­tiert wurde oder das Bild (z. B. eine Foto­grafie) ledig­lich kopiert werden soll. 

Außerdem wurden die zur Farb­inver­tierung ge­hörenden Ein­stellungen (z. B. die oben diskutierte Matrix) in die JSON-Datei „__bilder­setting.json“ ein­ge­tragen. 

Schließ­lich wurde auch ein schon vor­handenes Python-Script, mit dem Oszillo­gramme mit weißen Hinter­grund er­stellt werden (die ur­sprüng­lichen Screens­hots der Oszillo­skopen-Soft­ware haben einen schwarzen Hinter­grund) um die Mög­lichkeit er­weitert, die Farbe nicht zu invertieren, so dass auch Oszillo­gramme mit schwarzem Hinter­grund zur Ver­fügung stehen.  Auch hier ist der Datei­namen­suffix für die Oszillo­gramme mit schwarzem Hinter­grund „_invers“. 

Zweite HTML-Seite im dunklen Layout

(Für erste) wird unter Verwendung bzw. Modifikation des Scripts, das die fertigen HTML-Dateien baut, eine „doppelte Darstellung“ der Seite erzeugt.  Dabei liegen die gleich­namigen HTML-Dateien beider An­sichten in ver­schiedenen Ver­zeich­nissen (das Standard­layout im Haupt­ver­zeichnis und die hellig­keits­inver­tierte Layout in einem Unter­ordner „dark­mode) und ent­halten unter­schied­liche (Bild-)Dateiaufrufe mit unterschiedlichen CSS-Klassen. 

Dazu wurde jede HTML-Datei im Kopfbereich der Seite um einen Link auf die gleich­namige HTML-Datei im jeweils anderen Layout ergänzt. 

„Hinter den Kulissen“ sind weitere Änderungen not­wendig: 

Grund­layouts

Die beiden Grund­layouts werden in jeweils einem Style­sheet zusammen­gefasst – in der Datei „bootstrap.css“ für das Standard­layout sowie in der Datei „bootstrap_dark.css“ für das dunkle Layout

Farb­definitionen im Layout

Da die Seite ohne­hin mit der Unter­stützung des Frame­works Bootstrap um­ge­setzt wurde, liegt es nahe, dessen Mechanismen zu nutzen. 

Die Haupt-Style­sheets sind die Dateien „app.css“ und „app_dark.css“; sie unter­scheiden sich haupt­sächlich im Auf­ruf der Variablen­dateien „variables.scss“ resp. „variables_inv-color.scss“.  In diesen beiden Variablen­dateien werden alle unter­schied­lichen Farben auf ein jeweils gleich­namiges Makro gelegt – in den (meisten) anderen SCSS-Dateien wird an­sonsten nicht zwischen dem Standard- und dem inversen Layout unter­schieden. 

HTML-Dateien Standard-Layout

In den HTML-Dateien für das Standard­layout werden die Bildaufrufe (d. h. die <img />-Tags) um die Klasse „StdPrnt“ ergänzt. 

HTML-Dateien Dark­mode-Layout

Hier sind umfang­reichere Änderungen notwendig:

  • In den Links zu den Bildern als Popup in Groß­darstellung (für das Lightbox-Plugin) werden die (Bild-)Dateinamen geändert und der Suffix „_invers“ ergänzt. 

  • Die eigent­lichen (Bild)-Datei­aufrufe werden ver­doppelt – einmal mit der zusätz­lichen Klasse „StdPrnt“ (die „hellen“ Bilder für den Druck) und einmal mit der zusätzlichen Klasse „DarkImg“ (die „dunklen“ Bilder für den Bild­schirm), wobei in letzt­genannten Datei­auf­rufen auch wieder der Datei­name ge­ändert wird. 

  • Der Link im Seiten­kopf auf die HTML-Datei im jeweils anderen Layout wird in die Snippets / Vor­lagen ein­ge­tragen und jeweils an den konkreten Datei­namen an­ge­passt. 

  • In den HTML-Dateien für das farb­inver­tierte Layout werden die Links auf die Ver­zeich­nisse (das „CSS“-Ver­zeichnis, das „bilder/“-Ver­zeichnis etc.) ent­sprechend an­ge­passt – auch das er­folgt über Änderungen in den Vor­lagen. 

  • Die Bild­aufrufe wie auch die Links auf den Popups in den Roh­daten (HTML-Entwürfen) wurden ent­sprechend vor­bereitet – alle Illustrationen erhielten als ersten Para­meter die Klasse „abbildg“, alle Bilder­links für die Popups die Klasse „lgtboxlnk“ usw. 

    Das weist auch auf einen Nach­teil dieser Art von Lösung hin; sie verlangt vom Autor ein gewisses Maß an Disziplin beim Er­stellen der (HTML-)Roh­daten. 

Code­beispiele:

Um das Ganze noch einmal plausibel zu machen – zunächst ein Code­beispiel vorher (Link und auch Bildaufruf in einer Zeile): 

<figure class="AbbildgRahmenLos" id="IlluID">
 <a href="bilder/bild_riesig.gif" 
   data-lightbox="kolophonbilder" 
   data-title="Abb.&nbsp;1 ...">
  <span class="brahmen skizze" title="...">
   <img width="...
     src="bilder/bild_grosz.gif"
  srcset="bilder/bild_mini.gif  318w,
          bilder/bild_klein.gif 460w,
          bilder/bild_mitte.gif 664w,
          bilder/bild_grosz.gif 960w"
     alt="..." /><!-- IMG in einer Zeile -->
  </span>
 </a>
...

Anschließend ein Code­beispiel für die Standard­ansicht – hier sind lediglich ein paar Klassen hinzugekommen: 

<figure class="AbbildgRahmenLos" id="IlluID">
 <a class="lgtbxlnk"
   href="bilder/bild_riesig.gif" 
   data-lightbox="kolophonbilder" 
   data-title="Abb.&nbsp;1 ...">
  <span class="brahmen skizze" title="...">
    <img class="StdPrnt abbildg" width="...
     src="bilder/bild_grosz.gif"
  srcset="bilder/bild_mini.gif  318w,
          bilder/bild_klein.gif 460w,
          bilder/bild_mitte.gif 664w,
          bilder/bild_grosz.gif 960w"
     alt="..." /><!-- IMG in einer Zeile -->
  </span>
 </a>
...

Und dazu das Code­beipiel für das HTML im Dark­mode-Layout – das „<img />“-Tag wurde verdoppelt und einige (Bild-)Datei­namen geändert: 

<figure class="AbbildgRahmenLos" id="IlluID">
 <a class="lgtbxlnk"
   href="bilder/plan_invers_riesig.gif" 
   data-lightbox="kolophonbilder" 
   data-title="Abb.&nbsp;1 ...">
  <span class="brahmen skizze" title="...">
   <img class="StdPrnt abbildg" width="...
     src="bilder/bild_grosz.gif"
  srcset="bilder/bild_mini.gif  318w,
          bilder/bild_klein.gif 460w,
          bilder/bild_mitte.gif 664w,
          bilder/bild_grosz.gif 960w"
     alt="..." />
   <img class="DarkImg abbildg" width="...
     src="bilder/bild_invers_grosz.gif"
  srcset="bilder/bild_invers_mini.gif  318w,
          bilder/bild_invers_klein.gif 460w,
          bilder/bild_invers_mitte.gif 664w,
          bilder/bild_invers_grosz.gif 960w"
     alt="..." /><!-- IMG in einer Zeile -->
  </span>
 </a>
...

Reguläre Ausdrücke: 

Sowohl die hier be­schriebenen Um­wand­lungen beim Bau der Seite als auch die Vor­berei­tungen an den Roh­daten wären ohne den massiven Ein­satz regulärer Aus­drücke nicht mög­lich gewesen.  Dabei wurden die „Bereinigungen“ der HTML-Autoren­seiten (Anpassungen der Zeilenumbrüche etc.) wie auch das Setzen der neuen Klassen „abbildg“ und „lgtbxlnk“ halb­automatisch mit den umfangreichen Mög­lich­keiten des Editors VIM realisiert, um bei der Er­stellung der zwei ver­schiedenen HTML-Seiten mit den Mög­lich­keiten von Python aus­zu­kommen. 

Überlegungen zu Java­script

Die „web­technische“ Lösung für die Um­setzung zwei ver­schiedener Layouts mag dem einen oder anderen ein wenig hemds­ärmelig erscheinen bzw. es stellt sich die Frage, warum kein modernes Plug­inchen mit Java­script gefunden und ein­gebaut worden ist? 

Java­script wurde für diese Lösung zunächst nicht eingesetzt – die be­schriebene Lösung war für den Autor einfacher und sicherer um­zu­setzen.  Dabei mag es Lösungen für einen Dark­mode in aus­reichender Auswahl und Viel­falt geben.  Allerdings sind Lösungen, die im Wesent­lichen ein paar CSS-Farb­definitionen um­schalten, für diese Seite nicht ausreichend. 

Das soll jedoch kein Hindernis sein darüber nachzudenken, was eine solche Lösung „tun“ bzw. „können“ muss, d. h. welche ver­schiedene An­for­de­run­gen zu er­füllen wären und inwieweit es auch einiger Vor­berei­tung in den HTML-Dateien bedarf: 

Wechsel zwischen zwei Haupt-Style­sheets

Das Java­script-Lösung müsste nicht nur zwischen zwei Gruppen von Farb­definitionen, sondern zwischen zwei (Haupt)-Style­sheets wechseln – die ständige Vermischung von SCSS und Javascript oder die ständige Pflege doppelter SCSS-Klassen erscheint dem Autor zu um­ständ­lich und auch zu fehler­trächtig. 

Um­schreiben der Datei­namen: 

Die Java­script-Lösung müsste in jeder HTML-Datei alle Datei­aufrufe für die Bilddateien um­schreiben (d. h. den „_invers“-Suffix in die Datei­namen aller Bild­dateien einfügen). 

„Verdoppeln“ der Bildaufrufe: 

Dabei dürfte die Java­script-Lösung die Bilddatei­aufrufe für den Druck nicht um­schreiben, damit nicht die Bilder mit dem schwarzen Hinter­grund gedruckt werden. 

Das heißt, die Java­script-Lösung müsste für den Dark­mode alle Bild­auf­rufe verdoppeln (je einen Aufruf für das Bild mit dunklem Hinter­grund für den Bild­schirm und je einen Aufruf für das Bild mit hellem Hinter­grund für den Druck) – mit unter­schied­lichen CSS-Klassen für Bild­schirm und Druck, und, in einem der beiden Bild­aufrufe, mit ge­änderten Datei­namen für die Bild­dateien. 

„Nicht­technische“ Cookies

Der Forderung nach sinn­voller Nutz­bar­keit der Seite folgt die Not­wendig­keit, dass beim Neu­auf­ruf der Seite über Favoriten (d. h. nach Neustart des Browsers) die Seite im vorher benutzten Layout erscheint – d. h. es muss ein nicht-technisches Cookie gesetzt (und der Anwender auch damit behelligt werden!) 

Für den Wechsel in das inverse Layout der Illustrationen müssen also im Link zum Bild­popup der Datei­name geändert, der im Link ent­haltende Bild­aufruf ver­doppelt, in diesen beiden Bild­aufrufen eine Klasse und in einem der Bild­aufrufe alle Datei­namen geändert werden.  Diese Änderungen müssen beim Rück­wechsel auf das Standard­layout wieder ab­ge­wickelt werden.  Weiter­hin muss beim Wechsel der Layouts zwischen zwei Style­sheets gewechselt werden.  Last but not least ist ein Cookie zu setzen bzw. beim Neu­start der Seite aus­zu­werten. 

nach oben