当前位置: 首页 > Web前端 > JavaScript

一种基于HSV颜色模型的动态调色板算法研究与应用

时间:2023-03-27 15:24:44 JavaScript

与本文《一种基于HSV颜色模型的动态调色板算法研究与应用》相关的论文被录用并发表于《工业控制计算机》2022年第7期(7月25日出版)。此处内容仅供交流。与本文相关的结果已发表于《JINGWHALE智能动态调色板》。在现代互联网网页设计中,调色板是指用于数字图像管理的一组给定的有限颜色。网页颜色系统规范一般由调色板承载。一套完整的色系规范需要提供与主题色、功能色、中性色相同色系的调色板,以满足不同场景下产品设计的需求。使用要求。在目前主流的设计体系中,不同的业务场景对色彩的需求是多样的。一般网页文字设计的调色板需要颜色跨度大,颜色深浅不一,方便文字、容器背景等元素的色彩设计;和网页图形设计,如图表、彩色图标和插图,调色板的颜色一般要求颜色更鲜艳,具有更高的饱和度和透明度。因此,对于一种特定的基本色,两组拆分调色板会使页面的颜色不协调,扩展性相对较弱;不自然柔和,甚至有些颜色搭配会显得突兀。基于以上问题,本文提出了一种基于HSV颜色模型的动态调色板算法:基于相同的参考颜色,通过贝塞尔曲线动态梯度值机制配置HSV模型相关的参数值,使生成的调色板的颜色更柔和、更自然;同时单独或组合使用不同参考色或同一参考色不同参数的调色板,保证页面色彩的可扩展性和和谐性。1.基于HSV颜色模型的动态调色板算法的研究与实现HSV模型由ElvyRaySmith于1978年创立,是三基色光模式的非线性变换。模型中的颜色参数是色调(H)、饱和度(S)、透明度(V)。通过相关颜色理论,对HSV颜色模型的色调(H)、饱和度(S)、透明度(V)进行有机协调的控制,可以科学高效地完成颜色的生成和扩展。为了使调色板中的每种颜色之间有一定的差异,颜色渐变要柔和自然;HSV动态调色算法,以参考颜色为中心,遍历浅色区域个数和深色区域个数,主要思想如下:1)调色板中的颜色数设置为10,其中序号1-4为浅色区的衍生色,序号5为基色,序号6-10位为暗色区的衍生色(基于颜色生成的颜色)参考色在本文中称为派生色);2)、通过设置基准色左右色相环的间隔角criticalColorAngle°作为色相(H)的取值范围;3)、通过设置饱和度范围(SMin~SMax)和亮度范围(VMin~VMax),作为导出颜色饱和度(S)和透明度(V)的取值范围,SMin、SMax、VMin、VMax的取值范围为0~1.00;以参考色为参考位置,按序号顺序循环生成浅色派生色和深色派生色。导出颜色是根据相关颜色理论,按照色相(H)、饱和度(S)、透明度(V)的顺序,通过位置调用相应参数的贝塞尔曲线设置动态渐变值数,按顺序计算生成。导出颜色的色相(H)值、饱和度(S)值、透明度(V)值的具体算法如下:1.1导出颜色色相H值的算法思路为了保证即调色板的每一种颜色都是相邻的颜色,在色相环中,派生色的色相取2*criticalColorAngle°的区间相位,由基色H值的逆时针和顺时针criticalColorAngle°组成.其中,亮区色相区间为参考色(H值-criticalColorAngle)到参考色H值,暗区色相区间为参考色H值到参考色(H值)+criticalColorAngle)。为了保证导出的颜色色调值之间的柔和和自然,色调值为H动态渐变值结合设定的贝塞尔曲线HBezier10等分值和2*criticalColorAngle°区间10等分值。由于暖色和冷色对色彩的影响,因此需要对暖色和冷色进行判断,区别对待色相值。当基色为冷色系时(设置色相H值在60°-240°范围内),浅色区派生色H值=参考色H值-H动态渐变值派生色位置参数,暗区衍生色H值=基色H值+H动态渐变值衍生色位置参数;基色为暖色系时(设置色相H值在60°-240°以外),浅色区派生色H值=基色H值+H动态渐变值派生色位参数,暗区导出颜色H值=参考颜色H值-H动态渐变值导出颜色位置参数。导出色调H值的具体计算算法如下:constGlobalOpts=opts.criticalColorAngle?选择:默认选项;//用户设置参数constcriticalColorAngle=GlobalOpts.criticalColorAngle;//连续颜色区域constHBezier=GlobalOpts.HBezier;constlightColorCount=5;//亮区数量,左侧主色constdarkColorCount=4;//暗区数量,主色右侧constbaseEasingPointSetp=lightColorCount+darkColorCount+1;functiongenerateHValue(isLight,hsv,i){//isLight为浅色区域,hsv为底色,i为当前导出颜色的序号//计算H动态渐变值varHValue="";varpoint=i*(1/baseEasingPointSetp);varHEasing=bezierEasing(HBezier);vardynamicStepH=HEasing(point)*(criticalColorAngle/baseEasingPointSetp);//计算派生色H值if(Math.round(hsv.h)>=60&&Math.round(hsv.h)<=240){//冷色HValue=isLight?hsv.h-dynamicStepH*i:hsv.h+dynamicStepH*i;}else{//暖色HValue=isLight?hsv.h+dynamicStepH*i:hsv.h-dynamicStepH*i;}//校正计算导出颜色H值if(HValue>=360){HValue-=360;}elseif(HValue<0){HValue+=360;}returnHValue;}导出颜色的色相H值计算完成后,计算导出颜色的饱和度S值。饱和度值之间的柔和度和自然度,饱和度值结合设定的贝塞尔曲线SBezier10等分值和(SMax-SMin)区间10等分值作为S动态渐变值,由于生成的衍生颜色以参考颜色为参考位置。在计算光色区域的导出色饱和度S值时,根据动态梯度值降低光色饱和度S值;在计算深色区域导出的颜色饱和度S值时,深色系的饱和度S值根据动态梯度值增加。导出色彩饱和度S值的具体计算算法如下:constGlobalOpts=opts.criticalColorAngle?选择:默认选项;//用户设置参数constSMin=GlobalOpts.SMin;//最小饱和度值constSMax=GlobalOpts.SMax;//饱和度constSBezier=GlobalOpts.SBezier;constlightColorCount=5;//亮区数量,左侧主色constdarkColorCount=4;//暗区个数,主色右constbaseEasingPointSetp=lightColorCount+darkColorCount+1;functiongenerateSValue(isLight,hsv,i)){//isLight是否为浅色区域,hsv为参考色,i为当前导出颜色的序号//计算H动态渐变值varSValue="";varpoint=i*(1/baseEasingPointSetp);varSEasing=bezierEasing(SBezier);vardynamicStepS=SEasing(point)*((SMax-SMin)/baseEasingPointSetp);//计算导出的颜色S值if(isLight){SValue=hsv.s-dynamicStepS*i;}elseif(i===darkColorCount){SValue=hsv.s+dynamicStepS*i}else{SValue=hsv.s+dynamicStepS*i;}//修正导出的颜色S值if(SValue>1){SValue=1;}returnSValue;}导出颜色的饱和度S值计算完成后,计算导出颜色的透明度V值。1.3导出颜色透明度V值的算法思路为保证导出颜色明度值之间的柔和自然,透明度值根据设定的贝塞尔曲线SVBezier10等分值和(VMax-VMin)区间10等分divisionvalue合并后的值作为V动态梯度值。由于生成的导数色以参考色为参考位置,因此在计算导数色在光色区域的透明度V值时,光色系的透明度V值根据动态梯度值增加;在计算深色区域时,推导颜色的透明度V值时,根据动态渐变值降低深色系的透明度V值。导数颜色V值的具体计算算法如下:constcriticalColorAngle=60;//相邻颜色区域constlightColorCount=5;//亮区数量,左侧主色constdarkColorCount=4;//暗区数量,主色右侧constbaseEasingPointSetp=lightColorCount+darkColorCount+1;constVMin=0.75;//亮度的最小值constVMax=1;//亮度的最大值constEasing=bezierEasing(0,0.55,0.45,1);constGlobalOpts=opts.criticalColorAngle?选择:默认选项;//用户设置参数constVMin=GlobalOpts.VMin;//最小亮度constVMax=GlobalOpts.VMax;//最大亮度constVBezier=GlobalOpts.VBezier;constlightColorCount=5;//亮区数量,左边主色constdarkColorCount=4;//暗区数量,主色右侧constbaseEasingPointSetp=lightColorCount+darkColorCount+1;functiongenerateVValue(isLight,hsv,i){//isLight为亮区,hsv为Basecolor,i为当前导出颜色的序号//计算H动态渐变值varVValue=""varpoint=i*(1/baseEasingPointSetp);varVEasing=bezierEasing(VBezier);vardynamicStepV=VEasing(point)*((VMax-VMin)/baseEasingPointSetp)//计算导出的颜色V值if(isLight){VValue=hsv.v+dynamicStepV*i;}埃尔se{VValue=hsv.v-dynamicStepV*i;}//修正导出颜色的V值if(VValue>1){VValue=1;}returnSValue;}当导出颜色的色相H值、饱和度S值、透明度V值全部计算完毕后,生成导出颜色2.HSV动态调色板算法的应用通过上述HSV的研究与实现动态调色算法,以#4AD3FF为参考色为例,色调、饱和度和透明度的范围,以及对应的贝塞尔曲线进行参数设置,生成网页文字设计的调色板(用于文本、容器背景等)和Web图形图形(用于图表、彩色图标和插图等)。2.1生成参考色为#4AD3FF的网页文字设计调色板。网页文字设计调色板一般用在文字、容器背景等元素上。生成的调色板颜色跨度大,颜色不同,相关参数设置如下:hue:相邻颜色角度criticalColorAngle=30;饱和度范围:最小饱和度SMin=0,最大饱和度SMax=1.00;透明度范围:最小透明度SMin=0,最大透明度SMax=1.00。经过以上参数配置后,HSV动态调色板算法生成的调色板如图1所示:图12.2生成网页图形调色板#4AD3FF参考颜色网页图形调色板,一般用于图表、彩色图标、插图等图形,色彩饱和度和透明度较高。为了保证调色板颜色的高饱和度,限制S值的取值范围(0.2~1);为了保证调色板颜色的高透明度,限制了V值的取值范围(0.75~1);同时加入贝塞尔曲线,让生成的衍生色彩更加自然柔和。相关参数设置如下:hue:相邻颜色角度criticalColorAngle=30;贝塞尔曲线HBezier=(0,0.55,0.45,1);饱和度范围:最小饱和度SMin=0.20,最大饱和度SMax=1.00;贝塞尔曲线HBezier=(0,0.55,0.45,1);透明度范围:透明度最小值SMin=0.75,透明度最大值SMax=1.00;贝塞尔曲线HBezier=(0,0.55,0.45,1)。经过以上参数配置后,HSV动态调色板算法生成的调色板如图2所示:图2图2生成的调色板柔和自然,饱和度高,透明度高,方便网页设计的颜色使用图形设计要求,如通用图表、彩色图标和插图。以#4AD3FF为参考色生成的上述两个调色板组成的组合调色板,基于相同的参考色,保证了页面颜色的可扩展性和和谐性;Serre曲线使得图2网页图形调色板的调色比图1网页文本设计调色板的调色更自然、更柔和。3.结论本文提出了一种基于动态调色板的算法基于HSV颜色模型,满足了现代网页设计对颜色的多样化需求。该算法基于相同的参考色,通过贝塞尔曲线动态梯度取值机制配置HSV模型相关的参数值,使得生成的调色板的衍生色更柔和、更自然;同时,不同的参考色或相同的参考色在不同参数的调色板中可以单独使用,也可以组合使用,保证了页面颜色的扩展性和和谐性。