您的位置:首页 > 其它

颜色模型RGB,HSV颜色模型的数值之间相互转换

2017-05-04 15:42 567 查看
 公式详解 参考文献 : http://blog.csdn.net/idfaya/article/details/6770414

向作者白哦大十二分的敬意。

因为是做游戏的,所以才会有这方面的需求,我们的引擎采用的脚本是 lua, 我是通过lua将数据转换后为游戏材质属性赋值,因为下面的脚本运行速率并不是太高,所以就先在脚本中实现,方便调试。

--[[
* RGB颜色模型转化为HSV的颜色模型数据
* h,s,v 色相,饱和度, 色调(明度)
* 返回值 hsvValue h(0-360),s(0-255) v(0-255)
* @param colorRGB 颜色数值{r=0,g=255,b=100,a=255}, 数值部分0-255
]]
function _G.RGBConvertToHSV(colorRGB)
local r,g,b = colorRGB.r, colorRGB.g, colorRGB.b;
local h,s,v = 0,0,0;

local max1 = math.max(r, math.max(g,b));
local min1 = math.min(r, math.min(g,b));

if max1 == min1 then
h=0;
else
if r == max1 then
if g >= b then
h = 60 * (g-b) / (max1-min1);
else
h = 60 * (g-b) / (max1-min1) + 360;
end
end
if g == max1 then
h = 60 * (b-r)/(max1-min1) + 120;
end
if b == max1 then
h = 60 * (r-g)/(max1-min1) + 240;
end
end

if max1 == 0 then
s = 0;
else
s = (1- min1 / max1) * 255;
end

v = max1;

local hsvValue = {
h = h;
s = s;
v= v;
};

return hsvValue;
end

--[[
* HSV to RGB
* h,s,v 色相,饱和度,明度(色调)
* 返回值 colorValue 颜色值 (0-1)规范化数值
* @paream colorHSV 颜色数值{h,s,v}, h(0-360) s(0-255) v(0-255)
]]
function HSVConvertToRGB( colorHSV )
local cr,cg,cb = 0,0,0;

colorHSV.s = colorHSV.s /255;
colorHSV.v = colorHSV.v / 255;

if( colorHSV.s == 0 ) then
cr,cg,cb = colorHSV.v, colorHSV.v, colorHSV.v;

else
colorHSV.h = colorHSV.h /60;

local i = math.floor(colorHSV.h);
local f = colorHSV.h - i;
local a = colorHSV.v * ( 1 - colorHSV.s );
local b = colorHSV.v * ( 1 - colorHSV.s * f );
local c = colorHSV.v * ( 1 - colorHSV.s * (1 - f ) );

if i== 0 then
cr,cg,cb = colorHSV.v, c, a;
elseif i == 1 then
cr,cg,cb = b, colorHSV.v, a;
elseif i == 2 then
cr,cg,cb = a, colorHSV.v, c;
elseif i == 3 then
cr,cg,cb = a, b, colorHSV.v;
elseif i == 4 then
cr,cg,cb = c, a, colorHSV.v;
else
cr,cg,cb = colorHSV.v, a, b;
end
end

local rgbValue = {r = cr, g = cg, b= cb, a=1};
return rgbValue;
end

--[[
*HSL颜色值转换为RGB.
* h, s, l 色相,饱和度,亮度
* h(0-360) s(0-255) l(0-255);
* 返回的 color 数值 [0,1]
* @param hslValue
]]
function HSLConvertToRGB(hslValue)
local h,s,l = hslValue.h, hslValue.s, hslValue.l;
h = h/360;
s = s/255;
l = l/255;

local r, g, b;

if s == 0 then
r, g, b = l, l, l;
else
local hue2rgb = function(p, q, t)
if t < 0 then t = t +1; end
if t > 1 then t = t -1; end

if t < 1/6 then return p + (q - p) * 6 * t; end
if t < 1/2 then return q; end
if t < 2/3 then return p + (q - p) * (2/3 - t) * 6; end

return p;
end

local q = l < 0.5 and l * (1 + s) or l + s - l * s;
local p = 2 * l - q;
r = hue2rgb(p, q, h + 1/3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1/3);
end

local rgbValue = {r = r, g = g, b= b, a=1};
return rgbValue;
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: