您的位置:首页 > 其它

RGB和HSB的转换推算

2014-04-12 16:33 309 查看
RGB三原色是基于人肉眼对光线的生理作用。人眼内有三种椎状体“对这三种光线频率所能感受的带宽最大,也能独立刺激这三种颜色的受光体”,因此RGB称为三原色。比如,黄色波长的光对人眼的刺激效果,和红色与绿色同时刺激人眼相同,所以,对人来说R+G=yellow,即(255,255,0).

相对于RGB,HSB(也叫HSV)模式更便于描述人眼对与颜色的感觉。如图的HSB椎形坐标,横截面从下往上亮度值从0%到100%递增;横截面的中心点是灰色的,随着半径增大,饱和度从0增大到100%;色相取值0°~360°,代表截面上红、黄、绿、青、蓝、粉红的颜色变化。

public float[] rgb2hsb(float[] rgb) {
float[] hsb = new float[3];
float[] rearranged = rgb.clone();
int maxIndex = 0,minIndex = 0;
float tmp;
//将rgb的值从小到大排列,存在rearranged数组里
for(int i=0;i<2;i++) {
for(int j=0;j<2-i;j++)
if(rearranged[j]>rearranged[j+1]) {
tmp=rearranged[j+1];
rearranged[j+1]=rearranged[j];
rearranged[j]=tmp;
}
}
//rgb的下标分别为0、1、2,maxIndex和minIndex用于存储rgb中最大最小值的下标
for(int i=0;i<3;i++) {
if(rearranged[0]==rgb[i]) minIndex=i;
if(rearranged[2]==rgb[i]) maxIndex=i;
}
//算出亮度
hsb[2]=rearranged[2]/255.0f;
//算出饱和度
hsb[1]=1-rearranged[0]/rearranged[2];
//算出色相
hsb[0]=maxIndex*120+60* (rearranged[1]/hsb[1]/rearranged[2]+(1-1/hsb[1])) *((maxIndex-minIndex+3)%3==1?1:-1);
//防止色相为负值
hsb[0]=(hsb[0]+360)%360;
return hsb;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: