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 相关文章推荐
JavaScript获得选中文本内容的方法
Dec 02 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
Jan 15 Javascript
javascript中一些util方法汇总
Jun 10 Javascript
浅谈Javascript数组索引
Jul 29 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
Feb 14 Javascript
AngularJS 实现购物车全选反选功能
Oct 24 Javascript
在Vue中使用echarts的方法
Feb 05 Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 jQuery
jQuery创建折叠式菜单
Jun 15 jQuery
vue使用openlayers实现移动点动画
Sep 24 Javascript
Node实现搜索框进行模糊查询
Jun 28 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统计目录大小的自定义函数分享
2014/11/18 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
javascript常用方法汇总
2014/12/02 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
python实现哈希表
2014/02/07 Python
Python fileinput模块使用介绍
2014/11/30 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
python入门教程 python入门神图一张
2018/03/05 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
在TensorFlow中实现矩阵维度扩展
2020/05/22 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
python爬取招聘要求等信息实例
2020/11/20 Python
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
Python文件操作的面试题
2013/06/22 面试题
优秀中专生推荐信
2013/11/17 职场文书
会计专业自荐信范文
2013/12/02 职场文书
公开服务承诺制度
2014/03/26 职场文书
北京爱情故事观后感
2015/06/12 职场文书
平凡的世界读书笔记
2015/06/25 职场文书