C# Farbenmanagement #2

Ein paar kleine Optimierungen / Refactorings haben sich in meiner Farbenkonvertierungsklasse breitgemacht.

Zum einen habe ich den Code vereinfacht, indem ich sich wiederholenden Code entfernt habe, zum anderen brauchte ich noch eine weitere Konvertierungsart, und zwar vom XYZ Farbraum zurück in den L*ab Farbraum.

Farbmessgeräte werden üblicherweise einmal am Tag kalibriert, dazu haben sie einen Weiß-Standard der gemessen wird und an dem sich das Gerät orienterien kann. Somit werden die Alterungserscheinungen des Blitzlichtes wieder kompensiert und man bekommt gleichmässige Messergebnisse.

Die Werte dieses Standards liegen aber nur als XYZ Werte vor, das Messgerät liefert aber in der gebrauchten Einstellung nur L*ab Werte zurück, daher die kleine zusätzliche Konvertierungsmethode.

Bei den Refactorings hat sich gezeigt wie unendlich praktisch Unit-Tests sind. Man kann seine Methoden optimieren, kürzen, verändern. Ist man fertig lässt man die Unit-Tests drüberlaufen und kann sich dann sicher sein, dass die Überarbeitungen nichts an den Ergebnissen geändert hat.

Und hier nun der gesamte neue Code:

Read more

C# Farbenmanagement #1

Für eine Auftragsarbeit musst ich mich Farbräumen und deren Konvertierungen herumschlagen. Herausgefallen ist dabei so eine Art kleine „Farbverwaltungs“-Klassenbibliothek, mal sehen vielleicht wird ja in Zukunft noch mehr draus, es gibt ja noch viele Farbräume zu begutachten.

Anfangen tut das mit den verschiedenen Farbmodellen die es gibt, konkret brauchte ich nur einige wenige:

  • L*ab – ein gängiger (uralter) Standard in der „Farbenindustrie“
  • L*CH – eine andere Darstellung der Farbwerte
  • XYZ – eine Beschreibung des CIE Farbraumes
  • sRGB – wird u.a. von Windows verwendet um Farben auf dem Bildschirm darzustellen

Falls ihr mehr zu diesem Thema wissen wollt findet ihr ganz viele Ressourcen unter: Easy RGB

Um kurz auf die Programmiertechnik einzugehen: ich habe mich dazu entschieden die Klassen so in der Art immutable zu machen, das heisst eine einmal erzeugte Instanz kann nicht mehr geändert werden. Man kann die Werte einer Instanz nur über den Konstruktor ändern. So richtig immutable ist es aber wiederum doch nicht programmier, weil instanzen der gleichen Klasse bzw. die von einer dieser Modelklassen erben könnten ja theoretisch Werte ändern. Aber ich hatte jetzt keine Lust mich da im Moment weiter einzulesen und das wirklich 100%ig zu machen.

Und nun zu den Listings, die Namespaces hab ich rausgenommen, könnt ihr ja euch ganz einfach dazudenken 😉

Read more