2012-08-05 186 views
0

将HSL转换为HSB的公式是什么?我只能找到可以轻松将RGB转换为HSL的代码。据this stack overflow answer我可以CONVER HSB使用这个公式HSL:将hsl转换为hsb

(B - S)/ 2

,但我想要去的其他方式,以及(b + S)*比2返回显著不同的值Photoshop的转换,例如:

rgbtohsb(100,100,100) S:0 H:0 b:200 而Photoshop的返回0,0,39

这里是基于easyrgb.com网站的RGB我的代码到hsl代码(th被写在Brightscript,基本一样的语言为Roku Digital Video Player):

function RGBtoHSB(r as integer, g as integer, b as integer) as object 
hue=0.0 
var_R = (R/255) 
?"var_R=";var_r 
var_G = (G/255) 
?"var_g=";var_g 
var_B = (B/255) 
?"var_b=";var_b 
var_Min = min([ var_R, var_G, var_B ]) 'Min. value of RGB 
?"var_min=";var_min 
var_Max = max([ var_R, var_G, var_B ]) 'Max. value of RGB 
?"var_max=";var_max 
del_Max = var_Max - var_Min    'Delta RGB value 
?"del_max=";del_max 



LUM = (var_Max + var_Min)/2 
?"LUM=";LUM 
if (del_Max = 0)      'This is a gray, no chroma... 
?"del_max=0" 
    HUE = 0        'HSL results from 0 to 1 
    SAT = 0 
else         'Chromatic data... 
?"del_max";del_max 
    if (LUM < 0.5) then 
     SAT = del_Max/(var_Max + var_Min) 
     ?"Lum < 0.5 so SAt=";sat 
    else   
    ?"LUM > 0.5, LUM=";LUM 
     SAT = del_Max/(2 - var_Max - var_Min) 
     ?"SAT=";SAT 

     del_R = (((var_Max - var_R)/6) + (del_Max/2))/del_Max 
     ?"del_r=";del_r 
     del_G = (((var_Max - var_G)/6) + (del_Max/2))/del_Max 
     ?"del_g=";del_g 
     del_B = (((var_Max - var_B)/6) + (del_Max/2))/del_Max 
     ?"del_b=";del_b 


     if var_R = var_Max THEN 
      HUE = del_B - del_G 
      ?"var_r=var_max, so HUE=";hue 
     else if (var_G = var_Max) then 
      HUE = (1/3) + del_R - del_B 
      ?"var_g=var_max so HUE=";hue 
     else if (var_B = var_Max) then 
      HUE = (2/3) + del_G - del_R 
      ?"var_b=var_max so HUE=";hue 
     end if 



     if (HUE < 0) then 
      HUE = HUE + 1 
      ?"hue < 0 so hue=";hue 
     end if 
     if (HUE > 1) then 
      HUE = HUE - 1 
      ?"hue > 1 so hue=";hue 
     end if 

    end if 
end if 


?"sleeping" 
sleep(5000) 

bri=0.0 
bri=(lum+sat) *2 
?"hue=";HUE;" SAT=";sat;" LUM=";lum;" bri=";bri 

return {h:int(hue*255),s:int(sat*255),l:int(lum*255),b:int(bri*255)} 
end function 

回答

0

我已经写了一些功能,直接从HSV和背部转换HSL。 但是,它假设S,L,B和V值的范围是从0到1,而不是从0到100.此外,函数使用C#而不是BrightScript。

https://gist.github.com/4085710

的代码发布到公共领域。

0

相关的This Answer

色调是相同的两个让我们看看数学:

var SL = {s:0, l:0}, 
    SB = {s:0, b:0}; 

function sb2sl(){ 
    var l = (2 - SB.s/100) * SB.b/2;    // Lightness range 0-100 
    SL.s = Math.round(SB.s * SB.b/(l<50 ? l * 2 : 200 - l * 2)) |0; 
    SL.l = Math.round(l); 
} 
function sl2sb(){ 
    var t = SL.s * (SL.l<50 ? SL.l : 100-SL.l)/100; // Temp value 
    SB.s = Math.round(200 * t/(SL.l+t)) |0; 
    SB.b = Math.round(t+SL.l); 
} 
// Above, the "|0" prevents the NaN while dividing by 0 

参见:http://code.stephenmorley.org/javascript/colour-handling-and-processing/