PS的HSL控制算法是什么,请教高手

花熊 2012-01-30 10:16:35
我在网上搜到这些:Photoshop中HSL调节滤镜的原理。一个RGB格式的图片,通过HSL颜色格式,可以将图片的整体色调进行调节。比如我们要调节 Hue色调值,增加50。首先,取出每个点的RGB颜色值,转换为HSL,将得到的Hue值加上50,然后转换到RGB颜色,覆盖原来点的颜色。就这样,将所有的点都做一回合的互转,就能够将整个图片的色调进行调整。

所以做了一个DEMO测试,DEMO上三个滑块:H,S,L,H的范围:[-180, 180], S和L的范围[0, 200],
1.取得滑块三个值m_H,m_S, m_L
2.取出每个点的RGB颜色值,转换为HSL,为HSor,SSor, LSor
HSor += m_H;
SSor = (SSor*m_L/100.0f);
LSor = (LSor*m_S/100.0f);
<自己估计这里算法控制不对,求指点>
3.转换回RGB.

结果滑动渐变不对,求高手指点,
以下为自己的RGB和HSL转换代码

void RgbWithHsl_Hgy::RgbToHsl_Hgy(void)
{
double mn, mx;
int major;

if (red < green)
{
mn = red;
mx = green;
major = Green;
}
else
{
mn = green;
mx = red;
major = Red;
}

if (blue < mn)
{
mn = blue;
}
else if (blue > mx)
{
mx = blue;
major = Blue;
}

if (mn == mx)
{
lightness = mn/255;
saturation = 0;
hue = 0;
}
else
{
lightness = (mn+mx) / 510;

if (lightness <= 0.5)
{
saturation = (mx-mn) / (mn+mx);
}
else
{
saturation = (mx-mn) / (510-mn-mx);
}

switch (major)
{
case Red:
hue = (green-blue) * 60 / (mx-mn) + 360;
break;

case Green:
hue = (blue-red) * 60 / (mx-mn) + 120;
break;

case Blue : hue = (red-green) * 60 / (mx-mn) + 240;
break;
}

if (hue >= 360)
{
hue = hue - 360;
}
}
}

unsigned char Value(double m1, double m2, double h)
{
while (h >= 360)
{
h -= 360;
}
while (h < 0)
{
h += 360;
}

if (h < 60)
{
m1 = m1 + (m2 - m1) * h / 60;
}
else if (h < 180)
{
m1 = m2;
}
else if (h < 240)
{
m1 = m1 + (m2 - m1) * (240 - h) / 60;
}

return (unsigned char)(m1 * 255);
}

void RgbWithHsl_Hgy::HslToRgb_Hgy(void)
{
if (saturation == 0)
{
red = green = blue = (unsigned char) (lightness*255);
}
else
{
double m1, m2;

if (lightness <= 0.5)
{
m2 = lightness + lightness * saturation;
}
else
{
m2 = lightness + saturation - lightness * saturation;
}

m1 = 2 * lightness - m2;

red = Value(m1, m2, hue + 120);
green = Value(m1, m2, hue);
blue = Value(m1, m2, hue - 120);
}
}


越详细越好,谢谢。求高手.
...全文
132 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixiang1983 2012-02-01
  • 打赏
  • 举报
回复
顶......
morrist1987 2012-01-31
  • 打赏
  • 举报
回复
多结点分给我。。。多谢楼主
花熊 2012-01-31
  • 打赏
  • 举报
回复
自己解决了,网页故障,发了两次贴,杯具,散分

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧