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代码):
- public static float[] rgb2hsb(int rgbR, int rgbG, int rgbB) {
- assert 0 <= rgbR && rgbR <= 255;
- assert 0 <= rgbG && rgbG <= 255;
- assert 0 <= rgbB && rgbB <= 255;
- int[] rgb = new int[] { rgbR, rgbG, rgbB };
- Arrays.sort(rgb);
- int max = rgb[2];
- int min = rgb[0];
- float hsbB = max / 255.0f;
- float hsbS = max == 0 ? 0 : (max - min) / (float) max;
- float hsbH = 0;
- if (max == rgbR && rgbG >= rgbB) {
- hsbH = (rgbG - rgbB) * 60f / (max - min) + 0;
- } else if (max == rgbR && rgbG < rgbB) {
- hsbH = (rgbG - rgbB) * 60f / (max - min) + 360;
- } else if (max == rgbG) {
- hsbH = (rgbB - rgbR) * 60f / (max - min) + 120;
- } else if (max == rgbB) {
- hsbH = (rgbR - rgbG) * 60f / (max - min) + 240;
- }
- return new float[] { hsbH, hsbS, hsbB };
- }
- public static int[] hsb2rgb(float h, float s, float v) {
- assert Float.compare(h, 0.0f) >= 0 && Float.compare(h, 360.0f) <= 0;
- assert Float.compare(s, 0.0f) >= 0 && Float.compare(s, 1.0f) <= 0;
- assert Float.compare(v, 0.0f) >= 0 && Float.compare(v, 1.0f) <= 0;
- float r = 0, g = 0, b = 0;
- int i = (int) ((h / 60) % 6);
- float f = (h / 60) - i;
- float p = v * (1 - s);
- float q = v * (1 - f * s);
- float t = v * (1 - (1 - f) * s);
- switch (i) {
- case 0:
- r = v;
- g = t;
- b = p;
- break;
- case 1:
- r = q;
- g = v;
- b = p;
- break;
- case 2:
- r = p;
- g = v;
- b = t;
- break;
- case 3:
- r = p;
- g = q;
- b = v;
- break;
- case 4:
- r = t;
- g = p;
- b = v;
- break;
- case 5:
- r = v;
- g = p;
- b = q;
- break;
- default:
- break;
- }
- return new int[] { (int) (r * 255.0), (int) (g * 255.0),
- (int) (b * 255.0) };
- }
版权声明:本文为博主原创文章,未经博主允许不得转载。
RGB与HSB之间的转换公式的更多相关文章
- RGB与HSB之间转换
先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色 ...
- RGB与HSV之间的转换公式及颜色表
RGB & HSV 英文全称 RGB - Red, Green, Blue HSV - Hue, Saturation, Value HSV --> RGB 转换公式 HSV --> ...
- 【C#】RGB,CMYK,HSB各种颜色表示的转换(转)
[C#]RGB,CMYK,HSB各种颜色表示的转换 一.表示颜色的方式有很多种,如RGB,CMYK,HSB,Hex等等 1.RGB:这种表示颜色由三原色构成,通过红,绿,蓝三种颜色分量的不同,组合 ...
- RGB和HSB的转换推算
RGB三原色是基于人肉眼对光线的生理作用.人眼内有三种椎状体“对这三种光线频率所能感受的带宽最大,也能独立刺激这三种颜色的受光体”,因此RGB称为三原色.比如,黄色波长的光对人眼的刺激效果,和红色与绿 ...
- C# RGB和HSB相互转换
背景 最近做的项目中有这样一个场景,设置任意一种颜色,得到这种颜色偏深和偏浅的两种颜色.也就是说取该颜色同色系的深浅两种颜色.首先想到的是调节透明度,但效果不理想.后来尝试调节颜色亮度,发现这才是正解 ...
- RGB,CMYK,HSB各种颜色表示的转换 C#语言
Introduction Why an article on "colors"? It's the same question I asked myself before writ ...
- c# 颜色RGB到HSB互相转换
/// <summary> /// 色相,饱和度,亮度转换成rgb值 /// </summary> /// <returns></returns> pu ...
- e585. Converting Between RGB and HSB Colors
This example demonstrates how to convert between a color value in RGB (three integer values in the r ...
- YUV/RGB与H264之间的编解码
1.源码下载 http://download.videolan.org/x264/snapshots/ 2.编译 ./configure --prefix=./_install --enable-sh ...
随机推荐
- Struts学习之文件上传
* 单文件上传: * 在动作类action中声明相关属性: * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型: ...
- VC++学习之VC中常见问题
VC++学习之VC中常见问题 (1)为什么某个类突然在工作区间里面突然看不见了? 只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了 ( ...
- Delphi2010新发现-类的构造和析构函数功能
Delphi2010发布了. 虽然凭着对Delphi的热爱第一时间就安装了,但是现在可能是年纪大了,对新事物缺乏兴趣了.一直都没有仔细研究. 今天有点时间试了一下新功能. 本来C#和Delphi.NE ...
- Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)
[题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...
- SPOJ 8222 Substrings(后缀自动机)
[题目链接] http://www.spoj.com/problems/NSUBSTR/ [题目大意] 给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值. 求出所有的F. [题 ...
- Hive Server 2 安装部署测试
Hive 0.11 包含了Hive Server 1 和 Hive Server 2,还包含1的原因是为了做到向下兼容性.从长远来看都会以Hive Server 2作为首选 1. 配置hive ser ...
- android之PackageManager简单介绍
PackageManager相关 本类API是对全部基于载入信息的数据结构的封装,包含下面功能: 安装,卸载应用查询permission相关信息 查询Application相关信息(applicati ...
- 用C++如何实现开放API接口服务器
比如新浪微博的API服务器.接口是使用HTTP请求.服务器端如何实现一个HTTP SERVER呢?使用libcurl可以吗? c++的话,一般用libevent或则libev这种库来实现吧.当然如果对 ...
- Node.js笔记4
4. 文件系统 fs fs模块是文件操作的封装,提供了同步跟异步操作2个版本 * fs.readFile(filename,[encoding],[callback(err,data)]) 是最简单的 ...
- web前端的发展态势
以前 作为一个java程序员写的代码主要还是后台的代码,虽然开始的时候前后端都写,但是也是用别人造好的轮子来用,学学html,css,js,jquery,再找一个前端ui框架学学,上手之后我们就可以 ...