html中在线取色器,在线取色器(ColorPicker)的制造方式

Canvas制作取色板

在线效果:查看

附件是源代码,如果需要打开但不能上网,请手动修改Jquery等库

步骤:

1、首先制作一张取色板,作为img标签内容。可以使用PS制作。这里介绍使用html5的canvas来制作

制作后的canvas可以保存为图片。

var pixel = 4;

var canvas = document.getElementById("color_container");

var cxt=canvas.getContext("2d");

for(j=0; j<250; j++){

if(j%pixel == 0){

for(i=0; i<360; i++){

if(i%pixel == 0){

var s = getHSL(i, j);

cxt.fillStyle= s;

cxt.fillRect(i,j,4,4);

}

}

}

}

2、监听img标签的onclick时间,根据鼠标位置换算出点击的颜色值

$("#color_container").click(function(a){

var target = a.target;

var parent = target.parentElement;

var left = parent.offsetLeft;

var top = parent.offsetTop;

var i = a.clientX - left;

var j = a.clientY - top;

//获取偏移值i、j做后处理

});

3、RGB、HSL、hex(例如#FFFFFF)之间的转换

hex2rgb = function(hex){

var h = [];

h[0] = hex.substring(1,3);

h[1] = hex.substring(3,5);

h[2] = hex.substring(5,7);

var r, g, b;

r = parseInt(h[0], 16);

g = parseInt(h[1], 16);

b = parseInt(h[2], 16);

return [r, g, b];

}

rgb2hex = function(r, g, b){

r = r.toString(16);

if(r.length == 1){

r = "0" + r;

}

g = g.toString(16);

if(g.length == 1){

g = "0" + g;

}

b = b.toString(16);

if(b.length == 1){

b = "0" + b;

}

return "#" + r + g + b;

}

hsl2rgb = function(h, s, l){

var r, g, b;

if(s == 0){

r = g = b = 255;

}

else{

var q = (l<0.5)?(l * (1.0+s)):(l+s - (l*s));

var p = (2.0 * l) - q;

var Hk = h/360.0;

var T = [];

T[0] = Hk + 0.3333333;

T[1] = Hk;

T[2] = Hk - 0.3333333;

for(var i=0; i<3; i++){

if(T[i] < 0) T[i] += 1.0;

if(T[i] > 1) T[i] -= 1.0;

if((T[i]*6) < 1){

T[i] = p + ((q-p)*6.0*T[i]);

}

else if((T[i]*2.0) < 1){

T[i] = q;

}

else if((T[i]*3.0) < 2){

T[i] = p + (q-p) * ((2.0/3.0) - T[i]) * 6.0;

}

else{

T[i] = p;

}

}

r = T[0]*255.0;

g = T[1]*255.0;

b = T[2]*255.0;

r = Math.round(r);

b = Math.round(b);

g = Math.round(g);

r = (r>255)? 255 : ((r<0)?0 : r);

g = (g>255)? 255 : ((g<0)?0 : g);

b = (b>255)? 255 : ((b<0)?0 : b);

}

return [r, g, b];

}

rgb2hsl = function(r, g, b){

r = r/255;

g = g/255;

b = b/255;

var max, min, diff, r_dist, g_dist, b_dist;

max = Math.max(Math.max(r, g), b);

min = Math.min(Math.min(r, g), b);

diff = max - min;

var h, s, l;

l = (max + min)/2;

if(diff == 0){

s = 0;

l = 0;

}

else if(l < 0.5){

s = diff/(max + min);

}

else{

s = diff/(2 - max - min);

}

r_dist = (max - r)/diff;

g_dist = (max - g)/diff;

b_dist = (max - b)/diff;

if(r == max){

h = b_dist - g_dist;

}

else if(g == max){

h = 2 + r_dist - b_dist;

}

else {

h = 4 + g_dist - r_dist;

}

h = h * 60;

h = Math.round(h);

if(h < 0){

h += 360;

}

else if(h >= 360){

h -= 360;

}

return [h, s, l];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
取色源码 功能介绍: 取色,取到的颜色可以通过ColorChanged事件参数e.Color获得,还可以在控件里把current变量公开出来 实现过程: 控件由很多色块组成。目前固定尺寸6x36,你可以自己修改尺寸。 控件分层是这样的(从最底层到最上层): 1.控件绘图面2.色块3.网格4.边框5.光标 在Paint事件按上面顺序绘制2-5。 绘制网格很简单,根据色块大小隔一定距离画一道横(竖)线 绘制色块道理差不多,先获取当前坐标(行,列)的颜色(根据你自己定义的调色盘计算出来),然后填充一个方块,转到处理下一个坐标,直到全部行列都处理完。 然后绘制所有色块 从表面上看,是通过鼠标移动,选取每个色块获得颜色。其实不然。那样做,我就需要保存每个色块的颜色信息,白白浪费空间。我的实现方法是通过鼠标位置得知当前鼠标所在色块的坐标(行,列),然后用上面的颜色算法直接得到该色块的颜色,一句话搞定(Point pt是鼠标位置)。 标移动时会绘制光标,为了减少性能开销,不能直接Refresh()/Invalidate()控件,使用Invalidate(Rectangle)来重绘被鼠标弄脏的那个区域。所以用了两个小矩形保存旧光标和新光标的区域,然后在鼠标事件更新(和鼠标取色一起)。 然后鼠标移动事件里重绘时稍微把区域扩大点(避免留下难看的边框)。 最后一行「OnColorChanged();是用来引发颜色改变事件。把事件写出来基本就完成了。 然后再完善下属性之类的,就可以在你的程序里使用了。 程序简单适合新手学习使用。 注意: 开发环境为Visual Studio 2010
功能介绍: 取色,取到的颜色可以通过ColorChanged事件参数e.Color获得,还可以在控件里把current变量公开出来 实现过程: 控件由很多色块组成。目前固定尺寸6x36,你可以自己修改尺寸。 控件分层是这样的(从最底层到最上层): 1.控件绘图面2.色块3.网格4.边框5.光标 在Paint事件按上面顺序绘制2-5。 绘制网格很简单,根据色块大小隔一定距离画一道横(竖)线 绘制色块道理差不多,先获取当前坐标(行,列)的颜色(根据你自己定义的调色盘计算出来),然后填充一个方块,转到处理下一个坐标,直到全部行列都处理完。 然后绘制所有色块 从表面上看,是通过鼠标移动,选取每个色块获得颜色。其实不然。那样做,我就需要保存每个色块的颜色信息,白白浪费空间。我的实现方法是通过鼠标位置得知当前鼠标所在色块的坐标(行,列),然后用上面的颜色算法直接得到该色块的颜色,一句话搞定(Point pt是鼠标位置)。 标移动时会绘制光标,为了减少性能开销,不能直接Refresh()/Invalidate()控件,使用Invalidate(Rectangle)来重绘被鼠标弄脏的那个区域。所以用了两个小矩形保存旧光标和新光标的区域,然后在鼠标事件更新(和鼠标取色一起)。 然后鼠标移动事件里重绘时稍微把区域扩大点(避免留下难看的边框)。 最后一行「OnColorChanged();是用来引发颜色改变事件。把事件写出来基本就完成了。 然后再完善下属性之类的,就可以在你的程序里使用了。 程序简单适合新手学习使用。 注意: 开发环境为Visual Studio 2010

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值