Domanda

Qualcuno sa di un modo per ottenere HSL da un colore linearRGB (non un colore sRGB)? Ho visto un sacco di sRGB <-> conversioni HSL, ma nulla per linearRGB <-> HSL. Non so se è la stessa fundementally conversione con piccoli aggiustamenti, ma mi farebbe piacere avere una visione chiara qualcuno potrebbe avere su questo.

RGB lineare non è la stessa di linearizzazione sRGB (che sta prendendo [0255] e rendendo [0,1]). Lineare RGB trasformazione da / a sRGB è http://en.wikipedia.org/wiki/SRGB. In VBA, questo sarebbe stato espresso (prendendo in valori sRGB linearizzate [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

Ho provato l'invio di valori RGB lineare alle routine RGB_to_HSL standard e di nuovo fuori dalla HSL_to_RGB, ma non funziona. Forse perché HSL corrente <-> RGB algoritmi rappresentano per la correzione gamma e lineare RGB non è gamma corretti - non lo so esattamente. Ho visto quasi nessun riferimento che questo può essere fatto, ad eccezione di due:

  1. Un riferimento su http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9 (Numerati punto 10).
  2. Un riferimento su una fonte aperta Progetto Grafx2 @ http://code.google.com/p/grafx2/ problemi / dettaglio? id = 63 # C22 in cui il contribuente si afferma che che ha fatto lineare RGB <-> HSL conversione e fornisce po 'di codice C in un allegato al suo commento in un file .diff (Che non posso davvero leggere :()

Il mio intento è quello di:

  1. inviare da sRGB (per esempio, FF99FF (R=255, G=153, B=255)) per Lineare RGB (R=1.0, G=0.318546778125092, B=1.0)
    • utilizzando il codice di cui sopra (per esempio, G = 153 sarebbero ottenuti in Linear RGB da sRGB_to_linearRGB(153 / 255))
  2. per HSL
  3. modificare / modulare la saturazione da 350%
  4. rispedire da HSL-> Linear RGB-> sRGB, il risultato sarebbe FF19FF (R=255, G=25, B=255).

Uso funzioni disponibili da NET, come .getHue da un System.Drawing.Color non funziona in qualsiasi spazio sRGB superiore al 100% di modulazione di qualsiasi valore HSL, qui la necessità di RGB lineare da inviare nel anziché sRGB.

È stato utile?

Soluzione

Non ha molto senso convertire in RGB lineare, poiché HSL è definito in termini di valori di gamma codificati. Invece, scrivere il proprio sRGB funzione di conversione per HSL, di modulare la saturazione con quei valori (che consente potenzialmente fuori gamut valori di saturazione), e poi riconvertire sRGB, intensità che sono fuori gamma sRGB bloccaggio (o non consentendo cambiamenti di saturazione che non può essere codificato in sRGB).

Altri suggerimenti

Il System.Windows.Media.Color classe consente di ottenere o impostare scRGB via ScA, SCR, ScG, proprietà SCB, o RGB tramite le proprietà a, R, G, B.

Quindi, si potrebbe convertire RGB a HSL, manipolare che, poi convertire in RGB e conservare in un'istanza di colore. È quindi possibile leggere le proprietà scRGB convertiti.

Non è l'ideale, e potrebbe comportare una certa perdita di informazioni. Ma è un'opzione!

In base al commento qui , il problema non è fare la conversione in modo non corretto; è che si sta eseguendo conversioni successive su valori quantizzati. In altre parole, si sta assumendo il risultato di sRGB => RGB => HSL => HSL => RGB => sRGB e utilizzando tale nelle successive operazioni di colore. Il modo più semplice per mantenere la precisione è quello di mantenere sempre intorno al valore originale RGB e accumulare i cambiamenti nello spazio HSL che si desidera applicare. In questo modo, si sta sempre applicando le operazioni spaziali HSL al colore originale e non deve preoccuparsi di elaborazione ripetutamente valori quantizzati.

questo aiutare? Ci sono un sacco di link interessanti in questa domanda, forse qualcosa che funziona nel vostro caso, troppo ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top