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 相关文章推荐
jQuery学习笔记之DOM对象和jQuery对象
Dec 22 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
Aug 08 Javascript
js中call与apply的用法小结
Dec 28 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
Dec 08 Javascript
悬浮广告方法日常收集整理
Mar 18 Javascript
浅谈jQuery中的checkbox问题
Aug 10 Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
前端图片懒加载(lazyload)的实现方法(提高用户体验)
Aug 21 Javascript
webpack搭建vue 项目的步骤
Dec 27 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
Apr 16 Javascript
vue router 通过路由来实现切换头部标题功能
Apr 24 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 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与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
jQuery使用方法
2017/02/04 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
使用pip安装python库的多种方式
2019/07/31 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
大一学生假期实习的自我评价
2013/10/12 职场文书
医学专业大学生求职的自我评价
2013/11/27 职场文书
音乐节策划方案
2014/06/09 职场文书
企业趣味活动方案
2014/08/21 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
答谢词范文
2015/01/05 职场文书
2015年少先队活动总结
2015/03/25 职场文书
会计岗位工作总结
2015/08/12 职场文书
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android