HSB转RGB
2015-10-10 14:04
417 查看
要算出(h,s,b)对应的(r,g,b),可以分3步,以HSB=(130°,50%,80%)为例说明:
1、先算出(h,100%,100%)对应的(r’,g’,b’)。
先固定色相,色环图上色相H∈[-60°,60°]时红色分量最大,H∈[60°,180°]时绿色分量最大,H∈[180°,300°]时蓝色分量最大,此时B=100%,所以RGB的最大分量为255。
先算出HSB=(130°,100%,100%)对应的(r’,g’,b’):H=130°,在[60°,180°]区间,所以绿色分量为g’=255,红色分量r’=0;进一步地,130°处于[120°,180°],在这60°的区间上,色环上蓝色分量对应地从0递增到255,所以b’=(130°-120°)/60°*255=43。所以(r’,g’,b’)=(0,255,43)
2、固定色相后再调整饱和度,算出(h,s,100%)对应的(r”,g”,b”)。
在亮度B=100%时,从 演示中发现,饱和度S降低,即“不饱和度”(1-S)升高,会使得RGB与最大值255相差的部分对应增大,RGB三个分量越趋于相同就使得图像越灰。所以,
r”=r’+(255-r’)*(1-S) ……………………………… ①
g”和b”用同样的方法求出。当然,r’g’b’中的最大值不会变化。(r”,g”,b”)=(128,255,149)
3、最后算出(h,s,b)对应的(r,g,b)。
最后调整亮度,只要依照亮度值的百分比缩小就行了,(r,g,b)=(r”,g”,b”)*80%=(102,204,119)就是HSB=(130°,50%,80%)对应的RGB
1、先算出(h,100%,100%)对应的(r’,g’,b’)。
先固定色相,色环图上色相H∈[-60°,60°]时红色分量最大,H∈[60°,180°]时绿色分量最大,H∈[180°,300°]时蓝色分量最大,此时B=100%,所以RGB的最大分量为255。
先算出HSB=(130°,100%,100%)对应的(r’,g’,b’):H=130°,在[60°,180°]区间,所以绿色分量为g’=255,红色分量r’=0;进一步地,130°处于[120°,180°],在这60°的区间上,色环上蓝色分量对应地从0递增到255,所以b’=(130°-120°)/60°*255=43。所以(r’,g’,b’)=(0,255,43)
2、固定色相后再调整饱和度,算出(h,s,100%)对应的(r”,g”,b”)。
在亮度B=100%时,从 演示中发现,饱和度S降低,即“不饱和度”(1-S)升高,会使得RGB与最大值255相差的部分对应增大,RGB三个分量越趋于相同就使得图像越灰。所以,
r”=r’+(255-r’)*(1-S) ……………………………… ①
g”和b”用同样的方法求出。当然,r’g’b’中的最大值不会变化。(r”,g”,b”)=(128,255,149)
3、最后算出(h,s,b)对应的(r,g,b)。
最后调整亮度,只要依照亮度值的百分比缩小就行了,(r,g,b)=(r”,g”,b”)*80%=(102,204,119)就是HSB=(130°,50%,80%)对应的RGB
public float[] hsb2rgb(float[] hsb) { float[] rgb= new float[3]; //先令饱和度和亮度为100%,调节色相h for(int offset=240,i=0;i<3;i++,offset-=120) { //算出色相h的值和三个区域中心点(即0°,120°和240°)相差多少,然后根据坐标图按分段函数算出rgb。但因为色环展开后,红色区域的中心点是0°同时也是360°,不好算,索性将三个区域的中心点都向右平移到240°再计算比较方便 float x=Math.abs((hsb[0]+offset)%360-240); //如果相差小于60°则为255 if(x<=60) rgb[i]=255; //如果相差在60°和120°之间, else if(60<x && x<120) rgb[i]=((1-(x-60)/60)*255); //如果相差大于120°则为0 else rgb[i]=0; } //在调节饱和度s for(int i=0;i<3;i++) rgb[i]+=(255-rgb[i])*(1-hsb[1]); //最后调节亮度b for(int i=0;i<3;i++) rgb[i]*=hsb[2]; return rgb; }
相关文章推荐
- iGriamceV8.0 IG8.0.0 iOS8 V8基本设置和使用教程图
- iOS AFNetworking上传图片到服务器
- 规范化的软件项目演进管理--从 Github 使用说起
- ipc$共享
- 学习日志---Linux打开5
- WHERE约束
- Mockito 库、powermock扩展
- IOS9-CoreSpotlight到底怎么用?(OC语言版)
- grep 命令详解
- alt+f4对命令行窗口无效
- linux下压缩与解压缩以及打包命令详解
- android动态加载布局文件示例
- 适配器Adapter
- Ubuntu挂载U盘
- 【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次
- SQL注入——如何攻击(一)
- JS正则表达式验证账号、手机号、电话和邮箱
- Hadoop获得先进的步步高(四)-试Hadoop
- linux安装yaf(ubuntu教程)
- cydia substrate android permission denied Script Failure