JS在线图片取色器

来源:https://www.sucaihuo.com/js/3022.html 2017-09-17 16:35浏览(3665) 收藏

一款JS在线图片取色器代码,可以先选择一张本地图片,然后图片会出现在下面的预览区域里面,接着点击“显示所有颜色”按钮,便可取出图片对应的所有颜色,复制十六进制的颜色编码就可以随意使用了。
JS在线图片取色器
分类:其它特效 > 颜色选择器 难易:初级
查看演示 下载资源 下载积分: 20 积分

页面的head部分,需设置好页面元素的样式,代码如下:

body{margin: 0;}
.module-content{
	min-width: 770px;
	max-width: 1000px;
	width: 100%;
	color: #000;
	margin: 0 auto;
}
.module-head{
	text-align: center;
	font-weight: 500;
	margin: 0;
	font-size: 30px;
	height: 100px;
	line-height: 100px;
}
.module-check-img-box{
	width: 77%;
	float: left;
}
.module-check-box{
	width: 20%;
	float: right;
}
.module-list-name{
	font-size: 16px;
	height: 50px;
	line-height: 50px;
}
.module-box{
	width: 100px;
	height: 100px;
	overflow: hidden;
	position: relative;
}
.module-box input{
	width: 100px;
	height: 100px;
	opacity: 0;
	position: absolute;
	top: 0;
	left: 0;
	z-index: 10;
}
.module-box img{
	width: 100px;
	height: 100px;
}
.module-file-box{
	min-width: 400px;
	min-height: 400px;
	max-height: 1000px;
	overflow: auto;
	border: 1px solid #eee;
	border-radius: 5px;
	padding: 10px;
}
.module-check{
	position: relative;
	display: inline-block;
	height: 50px;
	line-height: 50px;
}
.module-check span{
	display: block;
	background:#fff url(img/check.png) no-repeat center center/16px 16px;
	width: 16px;
	height: 50px;
	position: absolute;
	top: 0;
	left: 0;
	z-index: 10;
}
.module-check input:checked + span{
	background:#fff url(img/checked.png) no-repeat center center/16px 16px;
}
.clear-float:after{
	content: '';
	display: block;
	height: 0px;
	clear: both;
}
.module-show-area section{
	float: left;
	width: 50%;
	font-size: 0;
}
.module-show-area section p{
	line-height: 30px;
	display: inline-block;
	width: 200px;
	font-size: 16px;
}
.module-show-area section p span{
	display: inline-block;
	width: 16px;
	height: 16px;
	margin-right: 5px;
}
.show-all-color{
	width: 100px;
	height: 40px;
	line-height: 40px;
	text-align: center;
	font-size: 14px;
	color: #fff;
	border: none;
	outline: none;
	background: blue;
	border-radius: 5px;
	margin: 20px 0;
}

页面的body部分,分别设置好图片上传、预览和颜色显示区域的对应容器和内容,代码如下:

<div class="module-content">
	<h1 class="module-head">JS在线图片取色器</h1>
	<div class="clear-float">
		<div class="module-check-img-box">
			<div class="module-list-name">请选择一张本地图片:</div>
            <div class="module-box">
            	<img src="img/tu.png"/>
                <input type="file" id="file" onChange="setFiles(this,'showImg')" class="form-control" placeholder="请选择一张本地图片">
            </div>
            <div class="module-list-name">图片显示区域:</div>
            <div class="module-file-box">
            	<img id="showImg" onClick="colorPicker(0,{showImg:'showImg',area16:'area-16',areaRgba:'area-rgba',check16:'check16',checkRgb:'checkRgb',checkAlike:'checkAlike',checkRange:'checkRange'})" src="img/tu.png"/>
            </div>
		</div>
        <div class="module-check-box">
        	<div class="module-list-name">
            	<label class="module-check">
	            	<input type="checkbox" id="checkRange" checked="checked"> 
	            	<span></span>
	            	是否模糊周边颜色
	            </label>
            </div>
            <div class="module-list-name">
            	<label class="module-check">
	            	<input type="checkbox" id="check16" onClick="check({area16:'area-16p',areaRgba:'area-rgbap',check16:'check16',checkRgb:'checkRgb'})" checked="checked"> 
	            	<span></span>
	            	是否十六进制显示
	            </label>
            </div>
            <div class="module-list-name">
            	<label class="module-check">
	            	<input type="checkbox" id="checkRgb" onClick="check({area16:'area-16p',areaRgba:'area-rgbap',check16:'check16',checkRgb:'checkRgb'})" checked="checked"> 
	            	<span></span>
	            	是否RGB显示
	            </label>
            </div>
            <div class="module-list-name">
            	<label class="module-check">
	            	<input type="checkbox" id="checkAlike"> 
	            	<span></span>
	            	显示相同颜色(此项由于较大,打印在控制台!)
	            </label>
            </div>
        </div>
	</div>
	<div>
		<button class="show-all-color" onClick="colorPicker(1,{showImg:'showImg',area16:'area-16',areaRgba:'area-rgba',check16:'check16',checkRgb:'checkRgb',checkAlike:'checkAlike',checkRange:'checkRange'})">显示所有颜色</button>
	</div>
    <div class="module-show-area">
    	<section id="area-16p">
    		<div class="module-list-name">十六进制显示区域:</div>
    		<div id="area-16"></div>
    	</section>
    	<section id="area-rgbap">
    		<div class="module-list-name">RBGA显示区域:</div>
    		<div id="area-rgba"></div>
    	</section>
    </div>
</div>

页面的底部,设置好图片的预览和颜色解析的事件响应等,代码如:

(() => {
	let obj = {};
	//获取DOM对象的方法
	let $ = function(id){
		return document.getElementById(id);
	}
	//获取预览图片路径
	let getObjectURL = function(file){
	    let url = null ; 
	    if (window.createObjectURL!=undefined) { // basic
	        url = window.createObjectURL(file) ;
	    } else if (window.URL!=undefined) { // mozilla(firefox)
	        url = window.URL.createObjectURL(file) ;
	    } else if (window.webkitURL!=undefined) { // webkit or chrome
	        url = window.webkitURL.createObjectURL(file) ;
	    }
	    return url ;
	}
	//十六进制转换器
	let hexadecimal = function(num) {
        var r = parseInt(num).toString(16);
        if (r.length == 1) {
            return '0' + r;
        }
        return r.toUpperCase();
    }
	//判断颜色是否已存在
    let checkHasColor = function(arr, r, g, b) {
        for (var i = 0; i < arr.length; i++) {
            var n = equalsColor(arr[0], arr[1], arr[2], r, g, b);
            if (n >= 0.8) {
                return true;
            }
        }
        return false;
    }
    //判断相同颜色
    let equalsColor = function(r1, g1, b1, r2, g2, b2) {
        return (255 - Math.abs(r1 - r2) * 0.297 - Math.abs(g1 - g2) * 0.593 - Math.abs(b1 - b2) * 0.11) / 255;
    }
    //建立canvas画布
    let canvas = function(obj,size,param){
    	let canvas = document.createElement("canvas");
        if (!canvas.getContext) {
            alert("很遗憾,您浏览器版本太老了,无法使用我们的小工具 !");
            return;
        }
        
        let ctx = canvas.getContext("2d");
        let str = "",str1 = "";
        let img = $(obj.showImg);
        let imgWidth = img.width;
        let imhHeight = img.height;
        let imgData = null;
        let newImg = new Image();
        
        newImg.onload = function(){
        	canvas.width = newImg.width;
            canvas.height = newImg.height;
            ctx.drawImage(newImg, 0, 0);
            if(param === 0){
            	let x = newImg.width * size.x / imgWidth;
                let y = newImg.height * size.y / imhHeight;
                let imgData = ctx.getImageData(x, y, 1, 1);
                let color16 = '#'+ hexadecimal(imgData.data[0]) + hexadecimal(imgData.data[1]) + hexadecimal(imgData.data[2])
                str1 = '<p><span style="background:'+ color16 +'"></span>'+ imgData.data.slice(0,3) +'</p>';
                str = '<p><span style="background:'+ color16 +'"></span>'+ color16 +'</p>';
            }else if(param === 1){
            	if (!confirm("显示所有颜色会比较慢,您是否要继续进行该操作?")) {
                    return;
                }
            	let flag = false;
                let indexRange;
                let jsonObj = {};
                let arr = [];
                let check = [];
                if ($(obj.checkRange).checked) {
                    flag = true;
                    indexRange = 10;
                } else {
                    indexRange = 1;
                }
                for (let i = 0; i < imgWidth; i += indexRange) {
                    for (let j = 0; j < imhHeight; j += indexRange) {
                        let imgData = ctx.getImageData(i, j, indexRange, indexRange);
                        let color = '#' + hexadecimal(imgData.data[0]) + hexadecimal(imgData.data[1]) + hexadecimal(imgData.data[2]);
                        if (flag) {
                            if (!checkHasColor(check, imgData.data[0], imgData.data[1], imgData.data[2]) && arr.indexOf(color) === -1) {
                                arr.push(color);
                                check.push([imgData.data[0], imgData.data[1], imgData.data[2]]);
                            }
                        } else {
                            if (arr.indexOf(color) === -1) {
                                arr.push(color);
                                check.push([imgData.data[0], imgData.data[1], imgData.data[2]]);
                            }
                        }
                    }
                }
                for (let index = 0; index < arr.length; index++) {
                    str += '<p><span style="background-color:' + arr[index] + '"></span>' + arr[index] +'</p>';
                    str1 += '<p><span style="background-color:' + arr[index] + '"></span>' + check[index] +'</p>';
                }
                if($(obj.checkAlike).checked){
                	for (let i = 0; i < imgWidth; i+=3) {
                		let arr = {};
                        for (let j = 0; j < imhHeight; j+=3) {
                            let imgData = ctx.getImageData(i, j, indexRange, indexRange);
                        	let color = '#' + hexadecimal(imgData.data[0]) + hexadecimal(imgData.data[1]) + hexadecimal(imgData.data[2]);
                        	arr[j] = color;
                        }
                        jsonObj[i] = arr;
                    }
                	console.log(JSON.stringify(jsonObj));
                }
            }
            $(obj.area16).innerHTML = str;
            $(obj.areaRgba).innerHTML = str1;
        }
        newImg.src = img.src;
    }
	window.setFiles = function(e,areaId){
		e = e || window.event;
		if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
            alert("很遗憾,您浏览器版本太老了,无法使用我们的小工具 !");
            return;
        }
		if(e.files.length > 0)$(areaId).src = getObjectURL(e.files[0]);
	}
	window.colorPicker = function(param,obj,e){
		e = e || window.event;
		$(obj.areaRgba).innerHTML = '';
		$(obj.area16).innerHTML = '';
		let size = {};
        if(param === 0){
        	if (e["offsetX"]) {
                size.x = e.offsetX;
                size.y = e.offsetY;
            } else {
                let offset = img.getBoundingClientRect();
                size.x = touch.clientX - offset.left;
                size.y = touch.clientY - offset.top;
            }
        }
		canvas(obj,size,param);
	}
	window.check = function(obj){
		console.log($(obj.check16).checked);
		if($(obj.check16).checked){
        	$(obj.area16).style.display = 'block';
        }else{
        	$(obj.area16).style.display = 'none';
        }
        if($(obj.checkRgb).checked){
        	$(obj.areaRgba).style.display = 'block';
        }else{
        	$(obj.areaRgba).style.display = 'none';
        }
	}
})()
标签: 颜色选择取色
评论0
头像

系统已开启自动识别垃圾评论机制,识别到的自动封号,下载出错或者资源有问题请联系全栈客服QQ 1915635791

1 2