Frage

Kennt jemand eine Möglichkeit, HSL aus einer linearRGB Farbe (keine sRGB-Farb) zu bekommen? Ich habe eine Menge von sRGB gesehen <-> HSL Konvertierungen, aber nichts für linearRGB <-> HSL. Nicht sicher, ob es fundementally die gleiche Umwandlung mit kleineren Verbesserungen, aber ich würde schätzen jede Einsicht jemand auf diese haben kann.

Linear RGB ist nicht das gleiche wie Linearisieren sRGB (die Aufnahme wird [0255] und macht es [0,1]). Linear RGB Umwandlung von / nach sRGB ist unter http://en.wikipedia.org/wiki/SRGB. In VBA, würde dies ausgedrückt werden (wobei in linearisierter sRGB-Werten [0,1]):

Public Function sRGB_to_linearRGB(value As Double)
   If value < 0# Then
      sRGB_to_linearRGB = 0#
      Exit Function
   End If
   If value <= 0.04045 Then
      sRGB_to_linearRGB = value / 12.92
      Exit Function
   End If
   If value <= 1# Then
      sRGB_to_linearRGB = ((value + 0.055) / 1.055) ^ 2.4
      Exit Function
   End If
   sRGB_to_linearRGB = 1#
End Function

Public Function linearRGB_to_sRGB(value As Double)
   If value < 0# Then
      linearRGB_to_sRGB = 0#
      Exit Function
   End If
   If value <= 0.0031308 Then
      linearRGB_to_sRGB = value * 12.92
      Exit Function
   End If
   If value < 1# Then
      linearRGB_to_sRGB = 1.055 * (value ^ (1# / 2.4)) - 0.055
      Exit Function
   End If
   linearRGB_to_sRGB = 1#
End Function

Ich habe in Linear RGB-Werte auf Standard RGB_to_HSL Routinen versucht das Senden und zurück aus HSL_to_RGB, aber es funktioniert nicht. Vielleicht, weil aktuelle HSL <-> RGB-Algorithmen für die Gamma-Korrektur-Konto und Linear RGB ist nicht Gamma korrigiert - ich weiß es nicht genau. Ich habe fast keine Hinweise gesehen, dass dies getan werden kann, mit Ausnahme von zwei:

  1. Ein Verweis auf http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9 (Nummerierte Punkt 10).
  2. Ein Verweis auf eine Open-Source Projekt Grafx2 @ http://code.google.com/p/grafx2/ Fragen / detail? id = 63 # c22 in dem es heißt, der Beitrag, dass er getan hat Linear RGB <-> HSL und Umwandlung liefert einig C-Code in einem Anhang zu seinem Kommentar in einer Datei .diff (Was ich kann nicht wirklich lesen :()

Meine Absicht ist:

  1. von sRGB (zum Beispiel schicken, FF99FF (R=255, G=153, B=255)) zu Linear RGB (R=1.0, G=0.318546778125092, B=1.0)
    • mit dem Code oben (zum Beispiel die G = 153 würde in Linear erhalten werden RGB von sRGB_to_linearRGB(153 / 255))
  2. HSL
  3. ändern / modulieren die Sättigung durch 350%
  4. Bitte senden Sie zurück von HSL-> Linear RGB-> sRGB, wäre das Ergebnis FF19FF (R=255, G=25, B=255).

Mit verfügbaren Funktionen von .NET, wie .getHue von einem System.Drawing.Color in jedem sRGB Raum über 100% Modulation jeden HSL-Wertes nicht funktioniert, daher die Notwendigkeit für Linear RGB in statt sRGB gesendet werden.

War es hilfreich?

Lösung

Es macht nicht viel Sinn für lineare RGB zu konvertieren, da HSL in Bezug auf die Gamma-codierten Werte definiert ist. Stattdessen Ihr eigenes Funktion convert sRGB zu HSL schreiben, die Sättigung mit diesen Werten modulieren (so dass potentiell Out-of-Gamut Sättigungswerte) und dann in sRGB konvertieren zurück, Intensitäten Klemm, die aus sRGB Bereich (oder Sättigung Änderungen Verbieten, dass kann nicht in sRGB) codiert werden.

Andere Tipps

Die System.Windows.Media.Color Klasse können Sie scRGB über ScA, scr, ScG SCB Eigenschaften oder RGB über A, R, G, B-Eigenschaften und festlegen.

So können Sie RGB zu HSL umwandeln könnten, dass manipulieren, umwandeln dann zurück in RGB und Speicher in einer Color-Instanz. Anschließend können Sie die konvertierten scRGB Eigenschaften ausgelesen werden.

Nicht ideal, und könnten einige Informationen Verlust einzubeziehen. Aber es ist eine Option!

Basierend auf Ihren Kommentar hier , ist Ihr Problem nicht tut die Umwandlung falsch; es ist, dass man aufeinander folgende Umrechnungen auf quantisierten Werten durchführt. Mit anderen Worten, nehmen Sie das Ergebnis von sRGB => RGB => HSL => HSL => RGB => sRGB und die Verwendung dieser in den nachfolgenden Farboperationen. Die einfachste Art und Weise Präzision zu halten ist immer um den ursprünglichen RGB-Wert zu halten und die Änderungen im HSL Raum, den Sie anwenden möchten akkumulieren. Auf diese Weise Sie die HSL Raumoperationen auf die ursprüngliche Farbe immer anwenden und Sie müssen über immer wieder quantisiert Werte Verarbeitung keine Sorge.

Hat diese helfen? Es gibt eine Menge interessanter Links in dieser Frage vielleicht etwas, das in Ihrem Fall funktioniert auch ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top