zoukankan      html  css  js  c++  java
  • RGB与HSB之间的转换公式

    先来了解一些概念:

    1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为:

    2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色.

      H(Hue):表示颜色的类型(例如红色,绿色或者黄色).取值范围为0—360.其中每一个值代表一种颜色.

      S(Saturation):颜色的饱和度.从0到1.有时候也称为纯度.(0表示灰度图,1表示纯的颜色)

      B(Brightness or Value):颜色的明亮程度.从0到1.(0表示黑色,1表示特定饱和度的颜色)

     

      

     

    后面地址是一个在线的观察RGB到HSB转换的工具:http://web.bentley.edu/empl/c/ncarter/MA307/color-converter.html

    用RGB来表示颜色虽然方便,但是两个相近的颜色的RGB值却可能相差十万八千里。用HSV(Hue色相、Saturation饱和度、Value(Brightness)明度,也叫HSB)来表示颜色就比较符合人们的习惯。

    RGB到HSV(HSB)的转换:


    HSV(HSB)到RGB的转换:


    根据以上说明,有以下转换公式(Java代码)

    1. public static float[] rgb2hsb(int rgbR, int rgbG, int rgbB) {  
    2.     assert 0 <= rgbR && rgbR <= 255;  
    3.     assert 0 <= rgbG && rgbG <= 255;  
    4.     assert 0 <= rgbB && rgbB <= 255;  
    5.     int[] rgb = new int[] { rgbR, rgbG, rgbB };  
    6.     Arrays.sort(rgb);  
    7.     int max = rgb[2];  
    8.     int min = rgb[0];  
    9.   
    10.     float hsbB = max / 255.0f;  
    11.     float hsbS = max == 0 ? 0 : (max - min) / (float) max;  
    12.   
    13.     float hsbH = 0;  
    14.     if (max == rgbR && rgbG >= rgbB) {  
    15.         hsbH = (rgbG - rgbB) * 60f / (max - min) + 0;  
    16.     } else if (max == rgbR && rgbG < rgbB) {  
    17.         hsbH = (rgbG - rgbB) * 60f / (max - min) + 360;  
    18.     } else if (max == rgbG) {  
    19.         hsbH = (rgbB - rgbR) * 60f / (max - min) + 120;  
    20.     } else if (max == rgbB) {  
    21.         hsbH = (rgbR - rgbG) * 60f / (max - min) + 240;  
    22.     }  
    23.   
    24.     return new float[] { hsbH, hsbS, hsbB };  
    25. }  
    26.   
    27. public static int[] hsb2rgb(float h, float s, float v) {  
    28.     assert Float.compare(h, 0.0f) >= 0 && Float.compare(h, 360.0f) <= 0;  
    29.     assert Float.compare(s, 0.0f) >= 0 && Float.compare(s, 1.0f) <= 0;  
    30.     assert Float.compare(v, 0.0f) >= 0 && Float.compare(v, 1.0f) <= 0;  
    31.   
    32.     float r = 0, g = 0, b = 0;  
    33.     int i = (int) ((h / 60) % 6);  
    34.     float f = (h / 60) - i;  
    35.     float p = v * (1 - s);  
    36.     float q = v * (1 - f * s);  
    37.     float t = v * (1 - (1 - f) * s);  
    38.     switch (i) {  
    39.     case 0:  
    40.         r = v;  
    41.         g = t;  
    42.         b = p;  
    43.         break;  
    44.     case 1:  
    45.         r = q;  
    46.         g = v;  
    47.         b = p;  
    48.         break;  
    49.     case 2:  
    50.         r = p;  
    51.         g = v;  
    52.         b = t;  
    53.         break;  
    54.     case 3:  
    55.         r = p;  
    56.         g = q;  
    57.         b = v;  
    58.         break;  
    59.     case 4:  
    60.         r = t;  
    61.         g = p;  
    62.         b = v;  
    63.         break;  
    64.     case 5:  
    65.         r = v;  
    66.         g = p;  
    67.         b = q;  
    68.         break;  
    69.     default:  
    70.         break;  
    71.     }  
    72.     return new int[] { (int) (r * 255.0), (int) (g * 255.0),  
    73.             (int) (b * 255.0) };  
    74. }  




    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    085 Maximal Rectangle 最大矩形
    084 Largest Rectangle in Histogram 柱状图中最大的矩形
    083 Remove Duplicates from Sorted List 有序链表中删除重复的结点
    082 Remove Duplicates from Sorted List II 有序的链表删除重复的结点 II
    081 Search in Rotated Sorted Array II 搜索旋转排序数组 ||
    080 Remove Duplicates from Sorted Array II 从排序阵列中删除重复 II
    079 Word Search 单词搜索
    078 Subsets 子集
    bzoj2326: [HNOI2011]数学作业
    bzoj2152: 聪聪可可
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4953014.html
Copyright © 2011-2022 走看看