JavaScript获取图片像素颜色并转换为box-shadow显示


Posted in Javascript onMarch 11, 2016

一、原理:
1.使用HTML5的FileReader API读取图片
FileReader文件读物器,用于读取客户端文件到,注意,文件读取完毕后并不会载入缓存
eg:

var upfile = document.querySelector('#upfile');
var fileReader = new FileReader();
fileReader.onload = function(evt)
{ 
  if(FileReader.DONE==fileReader.readyState)
  {
     var img = document.createElement('img');
     img.src = this.result; //是Base64的data url数据
     document.body.appendChild(img);
     console.log(fileReader);
   }
}
fileReader.readAsDataURL(upfile.files[0]);

2.使用HTML5 canvas 的 getImageData 获取图片像素信息
getImageData的直译即“获得图像数据”,他的作用是从canvas中提取像素出来。所以,他是有返回值的。

语法及返回值

ctx.getImageData(x,y,width,height);
这就是他的语法。而他的返回值是一个ImageData对象:
ImageData { width=10, height=10, data=Uint8ClampedArray}
这个ImageData对象包括:width,height,以及一个像素信息数组data。

这个像素信息数组是重中之重。他包括red,green,blue,和alpha,且每个都是0-255的数值——连 alpha 也是。

这个data数组的大小由像素个数决定,即ImageData的width*height.如getImageData(1,1,1,1),那data就只有一个像素信息;而getImageData(1,1,10,10),则有10*10=100个。

3.将像素信息转换为CSS3 box-shadow的值

二、实现效果:

JavaScript获取图片像素颜色并转换为box-shadow显示

三、实例代码:

<!DOCTYPE HTML PUBLIC> 
<html> 
 <head> 
 <meta charset="utf-8"> 
 <title>获取图片像素颜色,转换为css3 box-shadow</title> 
  
 <style type="text/css"> 
  body{margin: 0px; background:#f2f2f0;} 
  p{margin:0px;} 
  .title{color:#FFFF00; background:#000000; text-align:center; font-size:24px; line-height:50px; font-weight:bold;} 
  .file{position:absolute; width:100%; font-size:90px;} 
  .filebtn{display:block; position:relative; height:110px; color:#FFFFFF; background:#06980e; font-size:48px; line-height:110px; text-align:center; cursor:pointer; border: 3px solid #cccccc;} 
  .filebtn:hover{background:#04bc0d;} 
  .showimg{margin:10px auto 10px auto; -webkit-transition: all .3s; transition: all .3s;} 
  .showimg span{width:1px; height:1px; display:block; margin: -1px 0px 0px -1px;} 
  .css_code{margin:10px; padding:10px; display:none; border:1px solid #FFCC00; font-size:12px; background:#F1F1F1; white-space:pre-wrap; word-wrap:break-word; height:300px; overflow:auto;} 
  .css_code:hover{ 
    background:#DEFEDE; 
  } 
 </style> 
  
 <script type="text/javascript"> 
 window.onload = function(){ 
  
  var canvas = document.createElement('canvas'); 
  var context = canvas.getContext('2d'); 
  var showimg = document.getElementById('showimg'); 
  var shadow = showimg.getElementsByTagName('span')[0]; 
  var css_code = document.getElementById('css_code'); 
 
  document.getElementById('img').onchange = function(){ 
    var img = event.target.files[0]; 
 
    // 检查能否读取图片 
    if(!img){ 
      return ; 
    } 
 
    // 检查图片类型 
    if(!(img.type.indexOf('image')==0 && img.type && /\.(?:jpg|png|gif)$/.test(img.name)) ){ 
      alert('图片只能是jpg,gif,png'); 
      return ; 
    } 
 
    // 检查图片尺寸 
    if(img.size > 120*1024){ 
      alert('图片不能大于120K'); 
      return ; 
    } 
 
    // file reader 
    var reader = new FileReader(); 
    reader.readAsDataURL(img); 
 
    reader.onload = function(e){ // reader onload start 
 
      var image = new Image(); 
      image.src = e.target.result; 
 
      image.onload = function(){ // image onload start 
 
        var img_width = this.width; 
        var img_height = this.height; 
 
        // 设置画布尺寸 
        canvas.width = img_width; 
        canvas.height = img_height; 
 
        // 将图片按像素写入画布 
        context.drawImage(this, 0, 0, img_width, img_height); 
 
        // 读取图片像素信息 
        var imageData = context.getImageData(0, 0, img_width, img_height); 
 
        var arrbox = [], 
          length = imageData.data.length; 
 
        // 生成box-shadow 
        for(var i=0; i<length; i++){ 
 
          if(i%4 === 0){ // 每四个元素为一个像素数据 r,g,b,alpha 
 
            var x = i/4%img_width + 1;                // 横坐标 
            var y = Math.floor(i/4/img_width) + 1;          // 纵坐标 
            var alpha = Math.round(imageData.data[i+3]/255*100)/100; // alpha 值 
 
            if(imageData.data[i+3]==255){ // 没有alpha 值 
              var hex = gethex(imageData.data[i], imageData.data[i+1], imageData.data[i+2]); 
              arrbox.push(x + 'px ' + y + 'px #' + hex); 
            }else if(alpha>0){ // 有alpha 值 
              var rgba = imageData.data[i] + ',' + imageData.data[i+1] + ',' + imageData.data[i+2] + ',' + alpha; 
              arrbox.push(x + 'px ' + y + 'px rgba(' + rgba + ')'); 
            } 
 
          } 
        } 
 
        // 将数据写入dom 
        showimg.style.width = img_width + 'px'; 
        showimg.style.height = img_height + 'px'; 
 
        shadow.style.boxShadow = arrbox.join(','); 
 
        // 输出CSS3 box-shadow 
        css_code.style.display = 'block'; 
        css_code.innerHTML = 'box-shadow: ' + arrbox.join(','); 
 
         
        // 获取16进制颜色 
        function gethex(r,g,b){ 
          r = r.toString(16); 
          g = g.toString(16); 
          b = b.toString(16); 
 
          // 补0 
          r.length==1? r = '0' + r : ''; 
          g.length==1? g = '0' + g : ''; 
          b.length==1? b = '0' + b : ''; 
 
          var hex = r + g + b; 
 
          // 简化处理,如 FFEEDD 可以写为 FED 
          if(r.slice(0,1)==r.slice(1,1) && g.slice(0,1)==g.slice(1,1) && b.slice(0,1)==b.slice(1,1)){ 
            hex = r.slice(0,1) + g.slice(0,1) + b.slice(0,1); 
          } 
 
          return hex; 
        } 
 
      } // image onload end 
     
    } // reader onload end 
  } 
  
 } 
 </script> 
 
 </head> 
 
 <body> 
 <p class="title">获取图片像素颜色,转换为CSS3 box-shadow</p> 
 <p><input type="file" class="file" id="img"><label class="filebtn" for="img" title="JPG,GIF,PNG">请选择图片(小于120K)</label></p> 
 <p class="showimg" id="showimg"><span></span></p> 
 <p class="css_code" id="css_code"></p> 
 </body> 
</html>
Javascript 相关文章推荐
JS之小练习代码
Oct 12 Javascript
关于jQuery中的end()使用方法
Jul 10 Javascript
JQuery中Text方法用法实例分析
May 18 Javascript
js HTML5 Canvas绘制转盘抽奖
Sep 13 Javascript
jQuery实现手机上输入后隐藏键盘功能
Jan 04 Javascript
Vue2.x中的父子组件相互通信的实现方法
May 02 Javascript
使用vue构建一个上传图片表单
Jul 04 Javascript
Javascript中Promise的四种常用方法总结
Jul 14 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
Dec 19 Javascript
在vue中安装使用vux的教程详解
Sep 16 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
Sep 27 Javascript
解决Vue调用springboot接口403跨域问题
Sep 02 Javascript
详解Angularjs中的依赖注入
Mar 11 #Javascript
详解AngularJS过滤器的使用
Mar 11 #Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 #Javascript
js仿百度登录页实现拖动窗口效果
Mar 11 #Javascript
基于jQuery日历插件制作日历
Mar 11 #Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 #Javascript
JavaScript获取客户端IP的方法(新方法)
Mar 11 #Javascript
You might like
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
删除table表格行的实例讲解
2017/09/21 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
解决python线程卡死的问题
2019/02/18 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
Python 在函数上添加包装器
2020/07/28 Python
python dict如何定义
2020/09/02 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
募捐倡议书怎么写
2014/05/14 职场文书
德能勤绩工作总结
2015/08/11 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python