2009-09-28 62 views
4

有誰知道從linearRGB顏色(而不是sRGB顏色)獲取HSL的方法嗎?我看到很多sRGB < - > HSL轉換,但對於linearRGB < - > HSL沒有任何影響。不確定它是否具有相同的轉換和微小的調整,但我會很感激任何人可能對此有所瞭解。線性化RGB與線性化sRGB(取[0,255]並使其成[0,1])不同。從/到sRGB的線性RGB轉換爲http://en.wikipedia.org/wiki/SRGB。在VBA中,這將是表示(以線性sRGB值[0,1]取):LinearRGB轉換爲/從HSL

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 

我試圖從HSL_to_RGB線性RGB值標準RGB_to_HSL程序發送和退了出去,但它不起作用。也許是因爲目前的HSL < - > RGB算法解釋了伽瑪校正,而線性RGB不是伽瑪校正 - 我不知道。我所看到的幾乎沒有提及,這是可以完成的,除了兩個:

  1. 參考上 http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9 (編號爲第10項)。
  2. @ http://code.google.com/p/grafx2/issues/detail?id=63#c22 一個開源項目 一個Grafx2引用其中的貢獻者指出 他做線性RGB < - > HSL 轉換,並在爲.diff文件提供的附件中他的評論一些C代碼 (我真的不能閱讀:()

我的意圖是:

  1. 從sRGB的發送(例如, FF99FFR=255, G=153, B=255))至 線性RGB(R=1.0, G=0.318546778125092, B=1.0
    • 使用上面的代碼(例如, 的G = 153將被線性從sRGB_to_linearRGB(153/ 255)獲得 RGB)
  2. 到HSL
  3. 修改/調製飽和度 350%
  4. 從HSL-> Linear RGB-> sRGB發回,結果爲 FF19FFR=255, G=25, B=255)。

使用從.NET如.getHueSystem.Drawing.Color可用的功能,在上述任意HSL值的100%調製,因此需要進行線性RGB任何sRGB空間不工作,以代替sRGB而發送。

+0

400代表賞金!! ??哇靠! – 2012-11-17 20:55:44

回答

4

由於HSL是根據伽馬編碼值定義的,因此轉換爲線性RGB沒有多大意義。相反,將自己的函數convert sRGB寫入HSL,用這些值調製飽和度(允許可能超出色域飽和度值),然後轉換回sRGB,超出sRGB範圍的鉗位強度(或不允許飽和度變化不能用sRGB編碼)。

+0

嗯......你可能會做點什麼,我根本就沒有想過這個。讓我試試看,我會回來的結果。 – 2010-04-18 19:13:58

+0

單程測試正在使用這個想法!大!現在測試多個通行證。 – 2010-04-18 23:38:02

+0

呃,這個伎倆 - 非常感謝ergosys! – 2010-04-19 05:39:02

1

System.Windows.Media.Color類可讓您通過ScA,ScR,ScG,ScB屬性或RGB通過A,R,G,B屬性獲取或設置scRGB。

所以你可以將RGB轉換爲HSL,操縱它,然後轉換回RGB並存儲在Color實例中。然後您可以讀出轉換後的scRGB屬性。

不理想,可能會涉及一些信息丟失。但這是一個選擇!

+0

謝謝。我已經研究了這種可能性,主要的問題是每當我到達RGB時我都會失去一點顏色,然後再回來,因爲我將在計算之上進行多次計算。例如,我需要將亮度設置爲新的亮度,然後根據輸入變量更改飽和度,然後用白色着色。進出RGB,我發現我失去了確切的價值。 – 2009-09-28 14:37:20

+0

你有沒有什麼非.NET。 C++也許? – 2012-11-17 20:56:26

1

基於您的評論here,你的問題是不是做轉換錯誤;這是你正在執行量化值的連續轉換。換句話說,您將採用sRGB => RGB => HSL => HSL => RGB => sRGB的結果,並在隨後的顏色操作中使用它。保持精度的最直接的方法是始終保持原始RGB值,並在希望應用的HSL空間中累積更改。這樣,您始終將HSL空間操作應用於原始顏色,您不必擔心重複處理量化值。

+0

謝謝你的想法,但不,scRGB不是我在這裏找的。其次,System.Windows.Media.Color沒有從/到方法的任何HSL轉換。 – 2010-04-16 03:11:52

+0

@Otaku,那不是我的觀點。我的觀點是,如果您要執行從sRGB到HSL的額外轉換並返回,則需要保留更高精度格式的中間結果(Short,Int,Single,Double等)或將所有轉換應用於HSL空間一次。 – MSN 2010-04-16 17:19:05

+0

我想我並不完全關注你。線性RGB是Double(根據上面的代碼),即數據將保存在HSL和sRGB之間的位置。我不確定我在這裏有什麼誤解。 – 2010-04-16 18:37:02

1

請問this有幫助嗎?在這個問題中有很多有趣的鏈接,也許這也適用於你的情況...

+0

這裏有一些很好的鏈接,其中一個我要加書籤,但毫無疑問,沒有很多關於我之後的解釋。 – 2010-04-18 19:13:00