PS的HSL控制算法是什么
PS的HSL控制算法是什么,请教高手
我在网上搜到这些: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转换代码
越详细越好,谢谢。求高手.
------解决方案--------------------
楼主牛人!!多给点分吧。。
------解决方案--------------------
祝你好运
------解决方案--------------------
顶一下,接分了...
------解决方案--------------------
看这里
http://blog.****.net/ringphone/article/details/5191809
我在网上搜到这些: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转换代码
- C/C++ code
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); } }
越详细越好,谢谢。求高手.
------解决方案--------------------
楼主牛人!!多给点分吧。。
------解决方案--------------------
祝你好运
------解决方案--------------------
顶一下,接分了...
------解决方案--------------------
看这里
http://blog.****.net/ringphone/article/details/5191809