`
xinyu198736
  • 浏览: 17582 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

用js生成全色系调色盘的算法

阅读更多

 

去我博客浏览吧:http://www.html-js.com/?p=1252

 

js的调色盘组件其实制作起来还算比较复杂的,网上有一些现成的,但是大部分组件只能提供部分颜色的选取,例如web色.那如何制作一个全色系的颜色选取器呢?

本文主要将如何从底层来讲全色系用js生成一张色盘.然后如果要使用色盘的时候,利用坐标就可以逆过来计算出选取到的颜色了.

首先看个demo吧,下面的demo,需要在现代浏览器里浏览,这个色盘使用canvas动态生成的,每个像素的点都是经过计算后生成的,拖动滑动条可以调节明暗动态更新色盘.是不是很神奇,下面就会介绍这里面用到的一系列知识.


调节明暗度(0-1)

 

首先色彩有几种表示方法,这里用到两种,所以只介绍两种,一种叫做HSL,一种叫做RGB.
RGB大家很常用的,这个应该很熟悉了,就是red,green,blue.设置值的时候分别设置红绿蓝三色的比例就可以组合成不同的颜色,通常每个色系都是用0-255来表示.
HSL这个算是新概念吧,百科上有介绍,还是比较详细的:

http://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

三个单词的意思分别是:hue(色相)、saturation(饱和度)、lightness(亮度).其中色相的取值是0-360,饱和度取值是0-1,亮度取值也是0-1.其实用模型来理解HSL更容易理解.HSL模型建立起来后其实就是一个色相环
如上面的例子中右边的色环所示.色相就代表角度,从0-360,正好转了一个圈,饱和度代表半径,亮度是第三个维度,用滑动条控制,三个维度结合起来就是一个完整的色系了.

可以看出来了吧,用HSL来建模更形象直观,所以在程序中我们用HSL来建模,然后在显示到屏幕上的时候,我们用一个算法把HSL转换成RGB,然后显示到屏幕上.这个算法是这样的:

点击查看源代码( powered by www.html-js.com )

functionHSVToRGB(h,s,v){
vari;
varf,p,q,t;
varr,g,b;
if(s==0){
v=Math.floor(v*255);
return{
r:v,
g:v,
b:v
};
}
h/=60;
i=Math.floor(h);
f=h-i;
p=v*(1-s);
q=v*(1-s*f);
t=v*(1-s*(1-f));
switch(i){
case0:r=v;g=t;b=p;break;
case1:r=q;g=v;b=p;break;
case2:r=p;g=v;b=t;break;
case3:r=p;g=q;b=v;break;
case4:r=t;g=p;b=v;break;
default:r=v;g=p;b=q;break;
}
return{
r:r*255,
g:g*255,
b:b*255
};
}

其实就是一个公式,公式在维基百科上有给出,这里就不列出来了.网上有不少这种算法,但是发现有很多的算法有问题….我试了好几个最后才找出一个可用的.
然后,我们开始建模,将HSL中的HS表示成一个二维的平面,宽360,高100,然后将HS的值映射到这个平面上,L则映射到滑动条上,可以自由调节.

点击查看源代码( powered by www.html-js.com )

for(vari=0;i<100;i++){
for(vari2=0;i2<360;i2++){
pixel=HSVToRGB(i2,i/100,0.8)
setData(imageData,i2,i,[
pixel.r,
pixel.g,
pixel.b,
255
]);
}
}

这样,我们在一个100*360的循环里,获取每个点实际应该显示的颜色,用HSVToRGB方法来获取,这个方法的第一个参数是H,第二个参数是S,第三个参数是F.
我们把i2直接映射到H上,把i/100后映射到S上,V先设一个默认值0.8.
这里的x轴就是H,y轴就是S
这时候,其实我们就完成工作了.

下面我们就用canvas来把颜色画到页面上.
利用了canvas的像素操作,

点击查看源代码( powered by www.html-js.com )

varsetData=function(imageData,x,y,value){
imageData.data[((y*(imageData.width*4))+(x*4))+0]=value[0]
imageData.data[((y*(imageData.width*4))+(x*4))+1]=value[1]
imageData.data[((y*(imageData.width*4))+(x*4))+2]=value[2]
imageData.data[((y*(imageData.width*4))+(x*4))+3]=value[3]
}
varcan=$("canvas");
varctx=can.getContext('2d');
varimageData=ctx.createImageData(360,100)
for(vari=0;i<100;i++){
for(vari2=0;i2<360;i2++){
pixel=HSVToRGB(i2,i/100,0.8)
setData(imageData,i2,i,[
pixel.r,
pixel.g,
pixel.b,
255
]);
}
}
ctx.putImageData(imageData,0,0)

在canvas的像素级操作的时候,其实就是在操作一个imageData对象,这个对象中有一个值叫做imageData.data.这是一个一维数组.
这里有点绕,这个一维数组的实现其实有点让人迷糊,它里面存储着所有像素的颜色和透明度信息,每个像素有四个值,分别是红,绿,蓝,透明度.所以如果你想读取一个位于x,y坐标的像素的红色信息的话,需要这样:

点击查看源代码( powered by www.html-js.com )

imageData.data[((y*(imageData.width*4))+(x*4))+0]=value[0]

读取它的绿色信息就这样:

点击查看源代码( powered by www.html-js.com )

imageData.data[((y*(imageData.width*4))+(x*4))+1]=value[0]

明白了么,就是把所有像素的信息全部展开到了一个一维数组里面.

利用上面的知识,我们就可以生成一张平铺的全色系图片了,在使用的时候,其实不需要动态生成,你只需要把这张图片截下来,然后放在组件中,用户点击的时候,获取到坐标,建模成HSL,然后用HSVToRGB方法转成RGB即可.
跟上面的过程正好是相反的.

右边其实有个色环,这个是一个更形象的建模.将颜色值分布到一个圆形的空间内,这里x轴和y轴不代表任何意义,我们用半径划过的角度表示H,半径表示S.然后将这个角度和半径转换成坐标值,最后画出一个这样的图形:
如源码中所示,最后只是一个这样的转换:

点击查看源代码( powered by www.html-js.com )

varxx=Math.ceil(70+Math.cos(i2*Math.PI/180)*i*0.70)
varyy=Math.ceil(70+Math.sin(i2*Math.PI/180)*i*0.70)

完整代码:

点击查看源代码( powered by www.html-js.com )

var$=function(el){
returndocument.getElementById(el)
}
varmix=function(target,prototypes){
for(variinprototypes){
target[i]=prototypes[i];
}
}
vargetXY=function(el){
if(document.documentElement.getBoundingClientRect){//IE,FF3.0+,Opera9.5+
varbox=el.getBoundingClientRect();
return{x:box.left+document.body.scrollLeft,
y:box.top+document.body.scrollTop}
}else{

varpos=[el.offsetLeft,el.offsetTop];
varop=el.offsetParent;
if(op!=el){
while(op){
pos[0]+=op.offsetLeft+parseInt(op.style.borderLeftWidth)||0;
pos[1]+=op.offsetTop+parseInt(op.style.borderTopWidth)||0;
op=op.offsetParent;
}
}
return{x:pos[0],y:pos[1]}
}
}
varsetData=function(imageData,x,y,value){
imageData.data[((y*(imageData.width*4))+(x*4))+0]=value[0]
imageData.data[((y*(imageData.width*4))+(x*4))+1]=value[1]
imageData.data[((y*(imageData.width*4))+(x*4))+2]=value[2]
imageData.data[((y*(imageData.width*4))+(x*4))+3]=value[3]
}
varcan=$("canvas");
varctx=can.getContext('2d');
varcan2=$("canvas2");
varctx2=can2.getContext('2d');
varimageData=ctx.createImageData(360,100)
varimageData2=ctx2.createImageData(140,140)

varpixel
functiontoRGB(TColor,q,p,H){
if(TColor<0){
TColor+=1;
}
if(TColor>1){
TColor-=1;
}
if(TColor<(1/6)){
returnp+q-p*6*TColor;
}elseif(TColor<(1/2)){
returnq;
}elseif(TColor<(2/3)){
returnp+q-p*6*2/3-TColor;
}else{
returnp;
}
}

functionHSVToRGB(h,s,v){
vari;
varf,p,q,t;
varr,g,b;
if(s==0){
v=Math.floor(v*255);
return{
r:v,
g:v,
b:v
};
}
h/=60;
i=Math.floor(h);
f=h-i;
p=v*(1-s);
q=v*(1-s*f);
t=v*(1-s*(1-f));
switch(i){
case0:r=v;g=t;b=p;break;
case1:r=q;g=v;b=p;break;
case2:r=p;g=v;b=t;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; pa
分享到:
评论

相关推荐

    javascript MDUI调色盘

    对于MDUI调色盘,这里可能有如何配置和使用调色盘的详细步骤,包括如何在JavaScript中调用相关函数。 3. `css` - 这可能是一个目录,包含了项目的所有CSS文件。MDUI的样式通常会在这里定义,包括调色盘中的颜色变量...

    H5自适应小米汽车su7全色系展示html源码

    总的来说,这个“H5自适应小米汽车su7全色系展示html源码”是一个综合性的项目,涉及到前端开发的多个方面,包括但不限于HTML5结构、CSS3样式、JavaScript交互以及现代网页设计的最佳实践。对于学习者和开发者来说,...

    heatmap.js热图js

    **heatmap.js热图JS**是一种强大的JavaScript库,用于在网页或地图上生成热力图,显示数据的密度和分布情况。这种技术常被用于展示地理数据、网站点击流分析、性能监控等多种场景,通过颜色的深浅来直观地表示数据的...

    WEB网页设计中的全色系颜色表

    本篇文章将深入探讨全色系颜色表在网页设计中的应用,以及如何有效地使用颜色来提升用户体验。 全色系颜色表通常基于RGB(红、绿、蓝)色彩模式,这是数字媒体中最常用的颜色模型。RGB模式允许通过混合红色、绿色和...

    小米汽车SU7全色系H5自适应展示源码

    为了满足广大车迷和潜在消费者对小米汽车SU7全色系的视觉体验需求,我们特别推出了一款基于HTML的自适应H5源码,用于在线展示小米汽车SU7的全色系。这款源码不仅兼容各种设备和屏幕尺寸,而且能够完美地呈现出小米...

    7种网页调色板

    4. 类似色调色板:使用同一色系内的颜色,创造出温和、协调的氛围,适合想要呈现平静、舒适感觉的网站。 5. 三色调色板:选取色轮上的三个等距颜色,提供多样性和平衡,适用于需要活力和趣味性的设计。 6. 平行...

    javascript计算渐变颜色的实例

    javascript计算渐变颜色的实例 有时候,一个表格或者一片区域内,需要若干同色系从浅到深的颜色,如图所示:  如果需要的颜色少,则颜色的差异较大,需要的颜色多,则颜色差异小,如下图:   这时,就用到了同...

    彩色图像——RGB色系HSI色系YUVYCbCr实用教案.pptx

    综上所述,了解并掌握这些色彩模型及其相互转换对于从事图像处理、计算机视觉或者相关领域的专业人士来说至关重要,无论是开发图像处理算法,还是进行数字图像分析,都离不开对RGB、HSI和YUV等色系的理解和应用。

    CMYK和RGB对照色系表

    在给定的对照色系表中,我们看到12色相环中各个颜色的CMYK、RGB以及16进制(#)数值。这些数值可以帮助设计师在从屏幕设计过渡到印刷制作时准确地匹配颜色。例如,颜色编号1的CMYK值为100%、100%、45%、13%,RGB值为(0...

    chromajs适用于各种颜色操作的很小JavaScript库

    `chroma.js`是一个小巧但功能强大的JavaScript库,专为颜色操作而设计。它提供了一套简洁的API,使得在JavaScript中处理颜色变得简单且直观。这个库尤其适合那些需要在网页或应用中进行颜色转换、调整、分析以及可视...

    彩色图像——RGB色系HSI色系YUVYCbCrPPT教案.pptx

    彩色图像的表示和转换在计算机视觉和图像处理领域至关重要,主要涉及到RGB色系、HSI色系、YUV和YCbCr色系。这些色系各有特点,适用于不同的应用场景。 RGB色系,全称为Red、Green、Blue,是基于加色原理的三基色...

    彩色图像——RGB色系HSI色系YUVYCbCr.pptx

    彩色图像——RGB色系HSI色系YUVYCbCr.pptx

    基本配色分类配色色系表_RGB色彩对照表

    这张色系表通常包含了多种色系,比如单色系、相似色系、对比色系、互补色系等,每种色系都有其独特的搭配规则和情感表达,比如温暖色系给人以温馨、热情的感觉,而冷色系则给人以宁静、专业的感觉。 在设计中,RGB...

    RGB色系表(完整)

    RGB色系表(完整)

    web2.0色系与经典web2.0站点配色

    - **Facebook**:使用蓝色为主色调,象征信任和专业,同时用白色和灰色作为辅助色,简洁明了。 - **YouTube**:红白相间的配色方案,红色代表激情和活力,白色则提供简洁的背景。 - **Twitter**:标志性的蓝色,...

    色系分类各种色系.pdf

    黄色在设计中常用于传达快乐和积极的信息,但也可能过于刺眼,需要谨慎使用。 4. 黄绿色系:黄绿色是黄色和绿色的混合,通常与新生、希望和自然相关。这个色系包括黄绿、草绿、橄榄绿等,给人以清新和宁静的感觉,...

    配色色系表

    基本配色分类配色色系表_RGB色彩对照表_配色宝典

    web2.0色系web2.0色系

    web2.0色系 web2.0色系web2.0色系web2.0色系web2.0色系

    马卡龙色系PPT (13).pptx

    可以参考调色盘或色彩搭配工具来选择最佳组合。 2. 背景色与文字色:背景选择淡色的马卡龙色,文字则用对比度较高的颜色,如白色或深灰色,确保文字的清晰可读。 3. 图表配色:在数据图表中,可以用马卡龙色系为各个...

Global site tag (gtag.js) - Google Analytics