将HSL转换为HSB的公式是什么?我只能找到可以轻松将RGB转换为HSL的代码。根据{{3}},我可以使用以下公式将hsb转换为hsl:
(b - s)/ 2
但我想转向其他方式,而(b + s)* 2返回的值与photoshop的转换价值明显不同,例如:
?rgbtohsb(100100100) s:0 h:0 b:200 而photoshop返回0,0,39
这是我的代码基于this stack overflow answer网站的rgb到hsl代码(这是用Brightscript编写的,类似于easyrgb.com的基本语言):
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 :(得分:0)
我已经编写了一些函数来直接从HSV转换HSL并返回。 但是,它假定S,L,B和V值的范围为0到1而不是0到100.此外,函数使用的是C#而不是BrightScript。
https://gist.github.com/4085710
代码将发布到公共领域。
答案 1 :(得分:0)
Hue对两者都是一样的,所以让我们看看数学:
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/