计算机中的颜色XIV——快速变换颜色的V分量
基本知识回顾:
计算机中的颜色Color,用RGB模式存储(用R、G、B三个分量表示颜色,每个分量的范围是0—255)。
而计算机中的颜色除了用RGB模式表示以外,常见的还有HSV模式(或者是HSB、HSL模式)
RGB模式:
用R、G、B三个分量表示颜色
R分量:红色(Red)分量,整数型,范围是[0,255]
G分量:绿色(Green)分量,整数型,范围是[0,255]
B分量:蓝色(Blue)分量,整数型,范围是[0,255]
HSV模式:
用H、S、V三个分量表示颜色
H分量:色相(Hue)分量,整数型,范围是[0,360)
S分量:饱和(Saturation)分量,浮点数型,范围是[0,1]
V分量:亮度(lightness Value)分量,浮点数型,范围是[0,1]
在现在很多的前端UI框架中,都利用了HSV模式。因为HSV模式可以很方便的得出相近的颜色(色相相同、饱和和亮度不同的颜色)
而这两个模式的快速转换公式如下:
RGB模式到HSV模式的转换
令MAX为R、G、B三个分量的最大值;MIN为三个分量的最小值
若MAX=MIN,则
H = 0
S = 0
V = MAX / 255
若MAX≠MIN
当G≥B时
H = (Max – R + G – Min + B – Min) / (Max – Min) × 60
S = 1 – MIN / MAX
V = MAX / 255
当G<B时
H = 360 – (Max – R + G – Min + B – Min) / (Max – Min) × 60
S = 1 – MIN / MAX
V = MAX / 255
HSV模式到RGB模式的转换
先定义一种运算: { V1 , V2}
若V1 < 0,则{ V1 , V2} = 0;若V1 > V2,则{ V1 , V2} = V2;否则,{ V1 , V2} = V1。
例如:{ -1 , 2} = 0;{ 1 , 2} = 1;{ 3 , 2} = 2
则转换公式如下:
R = ( { | H / 60 – 3 | – 1 , 1 } × S + 1 – S) × 255 × V
G = ( { 2 – | H / 60 – 2 | , 1 } × S + 1 – S) × 255 × V
B = ( { 2 – | H / 60 – 4 | , 1 } × S + 1 – S) × 255 × V
快速变换颜色的V分量
有时在实际运用的时候,我们需要快速调整颜色的V分量,比如调整颜色的V分量增大20%(或者减少20%)
颜色Color的三个分量R、G、B,现在要调整V的分量为原来的80%。如何快速的计算?
假定颜色Color的三个分量H、S、V,则R、G、B和H、S、V的三个分量的关系为
R = ( { | H / 60 – 3 | – 1 , 1 } × S + 1 – S) × 255 × V
G = ( { 2 – | H / 60 – 2 | , 1 } × S + 1 – S) × 255 × V
B = ( { 2 – | H / 60 – 4 | , 1 } × S + 1 – S) × 255 × V
新的颜色Color2的三个分量为H、S、V × 80%(新颜色的V分量是原颜色的80%),则新的颜色的R、G、B分量(用R2、G2、B2表示)
R2 = ( { | H / 60 – 3 | – 1 , 1 } × S + 1 – S) × 255 × V × 80% = R × 80%
G2 = ( { 2 – | H / 60 – 2 | , 1 } × S + 1 – S) × 255 × V × 80% = G × 80%
B2 = ( { 2 – | H / 60 – 4 | , 1 } × S + 1 – S) × 255 × V × 80% = B × 80%
由此可知,快速的调整V分量的比例,只要把颜色的R、G、B的分量乘上相应的比例
那如何调整颜色的V分量到指定的值(比方说调整到V2)呢?
先求出颜色的V分量(V = MAX / 255),再计算出V2和V的比值,按照上面的公式计算即可
R2 = ( { | H / 60 – 3 | – 1 , 1 } × S + 1 – S) × 255 × V2 = R × V2 / V
G2 = ( { 2 – | H / 60 – 2 | , 1 } × S + 1 – S) × 255 × V2 = G × V2 / V
B2 = ( { 2 – | H / 60 – 4 | , 1 } × S + 1 – S) × 255 × V2 = B × V2 / V
实际的运用
笔者在网上找寻Bootstrap的相关资料的时候,发现一个很有意思的网站
Beautiful Buttons for Twitter Bootstrappers
在这个网站里,你可以自己设定一个颜色,它给你生成由你设定颜色的按钮的CSS
在查看生成CSS的 JS代码 后,发现生成代码如下
function refreshSwatch() {
var hue = $("#hue").slider("value"),
saturation = $("#saturation").slider("value"),
lightness = $("#lightness").slider("value"),
delta = $("#delta").slider("value"),
highlight = lightness + delta,
lowlight = lightness - delta,
superLowlight = lightness - delta * 1.5,
gradientTop = "hsl("+hue+", "+saturation+"%, "+highlight+"%)",
gradientBottom = "hsl("+hue+", "+saturation+"%, "+lowlight+"%)",
borderBottom = "hsl("+hue+", "+saturation+"%, "+superLowlight+"%)",
hsl = "hsl("+hue+", "+saturation+"%, "+lightness+"%)",
highhex = hsl2Hex(hue, saturation, highlight),
lowhex = hsl2Hex(hue, saturation, lowlight),
text = getTextColor(lightness, delta),
css = generateHSLGradient(hsl, gradientTop, gradientBottom, borderBottom, text, highhex, lowhex),
embeddedCss = ".btn-custom {\n"+css+"}";
$("button.custom").not('.sample').attr('style', css);
$(".ui-slider-range").css("background", hsl);
$('#embedded_css').html(embeddedCss);
$('.ui-slider-handle').each(function(){
var v = $(this).parents('div').slider("value");
var i = $(this).parents('div').attr('id');
$("#"+i+"_value").text(v);
});
}
可以看到,在给定一个颜色后,自动生成相关的颜色(gradientTop、gradientBottom、borderBottom),这些颜色也仅仅是V分量的不同
我们完全可以利用上面的公式,对这些计算进行简化
基本色Color的三个分量H、S、V,得到R、G、B三个分量
那么
gradientTop颜色(V2 = V + delta)为
R2 = R × V2 / V = R × ( V + delta ) / V
G2 = G × V2 / V = G × ( V + delta ) / V
B2 = B × V2 / V = B × ( V + delta ) / V
gradientBottom颜色(V3 = V - delta)为
R3 = R × V2 / V = R × ( V - delta ) / V
G3 = G × V2 / V = G × ( V - delta ) / V
B3 = B × V2 / V = B × ( V - delta ) / V
superLowLight颜色(V4 = V - 1.5 × delta)为
R4 = R × V2 / V = R × ( V - 1.5 × delta ) / V
G4 = G × V2 / V = G × ( V - 1.5 × delta ) / V
B4 = B × V2 / V = B × ( V - 1.5 × delta ) / V
甚至,在预先计算出基本量后,可以快速计算各个分量
基本量
R0 = ( { | H / 60 – 3 | – 1 , 1 } × S + 1 – S) × 255
G0 = ( { 2 – | H / 60 – 2 | , 1 } × S + 1 – S) × 255
B0 = ( { 2 – | H / 60 – 4 | , 1 } × S + 1 – S) × 255
则基本色为
R = R0 × V
G = G0 × V
B = B0 × V
gradientTop颜色(V2 = V + delta)为
R2 = R0 × ( V + delta )
G2 = G0 × ( V + delta )
B2 = B0 × ( V + delta )
gradientBottom颜色(V3 = V - delta)为
R3 = R0 × ( V - delta )
G3 = G0 × ( V - delta )
B3 = B0 × ( V - delta )
superLowLight颜色(V4 = V - 1.5 × delta)为
R4 = R0 × ( V - 1.5 × delta )
G4 = G0 × ( V - 1.5 × delta )
B4 = B0 × ( V - 1.5 × delta )
下面是利用该网页生成的CSS得到的按钮,看看吧,效果还不错
Be Excellent To Each Other »
计算机中的颜色XIV——快速变换颜色的V分量的更多相关文章
- JS实现鼠标移入DIV随机变换颜色
今天分享一个在 JavaScript中,实现一个鼠标移入可以随机变换颜色,本质就是js的随机数运用. 代码如下: <!DOCTYPE html> <html> <head ...
- Flutter 实现“斑马纹”背景(需要变换颜色)
Flutter 实现"斑马纹"背景 由于工作中项目需求,需要将H5转换为Flutter代码. 其中的斑马纹背景需要根据接口返回的颜色来渲染,所以不能只是图片形式,无法通过decor ...
- Android中Listview点击item不变颜色以及设置listselector 无效
Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...
- iTween基础之Color(变换颜色)
一.基础介绍:二.基础属性 原文地址: http://blog.csdn.net/dingkun520wy/article/details/51065275 一.基础介绍 ColorTo:从当前颜色变 ...
- Zend Studio 12.0.2正式版发布和破解方法,zend studio 12.0.1汉化,相式设置为Dreamweaver,空格缩进为4个, 代码默认不折叠的设置,Outline中使用的图形标志,代码颜色之eot设置。
背景:zend studio 12.0.2 修复了一个12.0.1的: Fixed problem with referenced variables marked as undefined,我都说 ...
- VB 中ListView 某一列的颜色添加不上去的解决方法
做过VB,对添加某一行中的某一列的背景颜色 ,和文字颜色,来表明某种意义的时候,会有添加不上去的情况 abc = Nothing abc = New ListViewItem.ListViewSubI ...
- VC编程中如何设置对话框的背景颜色和静态文本颜色
晚上编一个小程序,涉及到如何设置对话框的背景颜色和静态文本颜色.这在VC6.0中本来是一句话就搞定的事.在应用程序类中的InitInstance()函数添加: //设置对话框背景和文本颜色 SetDi ...
- 设置EditText控件中提示消息hint的字体颜色和大小
设置EditText控件中提示消息hint的字体颜色和大小 1.设置字体大小 代码例: public void init(){ hint= (EditText) findViewById(R.id.i ...
- android中在java代码中设置Button按钮的背景颜色
android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...
随机推荐
- mbps
Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写 传输速率是指设备的的数据交换能力,也叫“带宽”,单位是Mbps(兆位/秒),目前主流的集线器带宽主要有10Mb ...
- Jsoup实现java模拟登陆
Jsoup实现java模拟登陆 2013-10-29 14:52:05| 分类: web开发|举报|字号 订阅 下载LOFTER我的照片书 | 1:如何获取cookies. 1.1 ...
- DirectX 9 SDK安装后在vs2010里编译BaseClasses出错问题解决方法
打开你的dx的sdk安装目录,例如: D:/DX90SDK/Samples/C++/DirectShow/ 这里就有一个叫baseclasses的工程,为安全起见,请先备份此工程. 1,双击basec ...
- IPC机制--Binder
文章来自 Android技术内幕 系统卷 转:http://www.linuxidc.com/Linux/2011-08/40508.htm 什么是IPC机制以及IPC机制的种类 在Linux中,是以 ...
- ASP.NET控件绑定数据源
DataList/GridView/Repeater DataSet表示数据集,其中包含表,约束和表之间的关系.与现有数据源的交互通过DataAdapter来控制. 源代码示例: SqlDataAda ...
- JavaScript的prototype(原型)
JavaScript的每一个对象都有prototype属性哦 对象方法.类方法.原型方法 1.对象方法:理解就很简单了,主要是如果类生成一个实例,那么该实例就能使用该方法2.类方法:不需要通过生成实例 ...
- 实验12:Problem J: 动物爱好者
#define null ""是用来将字符串清空的 #define none -1是用来当不存在这种动物时,返回-1. 其实这种做法有点多余,不过好理解一些. Home Web B ...
- 【原】兼容IOS6以及旧版本的旋转处理方法,心得总结
最近的项目需要频繁处理屏幕的旋转以及各控件的自适应坐标.IOS6出来之后,屏幕旋转的处理方法变得复杂很多.在查阅了很多资料以及动手测试之后,得出以下几点精简的体会: 对于IOS6.0以上版本: 1.如 ...
- iOS使用Workspace来管理多项目
开发中会有一些常用的类或方法,或者是某个特定功能的,比如一个自定义的弹框.一个更容易使用的网络请求库,可以把它们放到一个单独的工程里,通过静态库(library.FrameWork)的方式应用到任何其 ...
- iOS 开发技巧-制作环形进度条
有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现. 先看一下这篇博客,博客地址:ht ...