通过javascript把图片转化为字符画


Posted in Javascript onOctober 24, 2013

通过javascript把图片转化为字符画

1.获取上传图片对象数据
Javascript无法直接获取本地上传的图片的数据,html5可以解决这一问题 。html5里面的FileReader interface可以把图片对象的数据读到内存,然后通过接口的进度事件(Progress Events)访问这些数据。
浏览器支持:
1、Internet Explorer: 10+
2、Firefox: 10+
3、Chrome: 13+
4、Opera: 12+
5、Safari: partial

var reader = new FileReader();                        //建立一个FileReader接口  
reader.readAsDataURL(fileBtn.files[0]);        //fileBtn为文件上传控件对象  
reader.onload = function () {                             //在onload事件中访问图像数据  
    img.src = reader.result;  }

2.获取图像对象像素点
图像对象的getImageData 方法返回一个对象,每个像素点的 rgba 值都保存在其 data 属性下面,这是一个一位数组, 也就是说,rgba 分别对应一个值,然后接着就是一下像素点的 rgba,假设 getImageData.data 的值为 [1,2,3,4,5,6,7,8], 那么 getImageData 对象范围就包含了 2 个像素点,第一个像素点的 rgba 值分别是 1,2,3,4,第二个像素点的就是 4,5,6,7,8。 因此,我们在取每个像素点的 rgba 值的时候其index 应该在像素点的索引值上乘以 4,然后通过 getGray() 计算灰度。

var imgData = c.getImageData(0, 0, img.width, img.height);  
var imgDataArr = imgData.data;  
var imgDataWidth = imgData.width;  
var imgDataHeight = imgData.height;  
for (h = 0; h < imgDataHeight; h += 12) {  
    for (w = 0; w < imgDataWidth; w += 6) {  
        var index = (w + imgDataWidth * h) * 4;  
        var r = imgDataArr[index + 0];  
        var g = imgDataArr[index + 1];  
        var b = imgDataArr[index + 2];  
    }  
} 

3.根据rgb值计算灰度
不同的RGB空间,灰阶的计算公式有所不同,常见的几种RGB空间的计算灰阶的公式如下:
1、简化 sRGB IEC61966-2.1 [gamma=2.20]
Gray = (R^2.2 * 0.2126  + G^2.2  * 0.7152  + B^2.2  * 0.0722)^(1/2.2)
2、 Adobe RGB (1998) [gamma=2.20]
Gray = (R^2.2 * 0.2973  + G^2.2  * 0.6274  + B^2.2  * 0.0753)^(1/2.2)
3、Apple RGB [gamma=1.80]
Gray = (R^1.8 * 0.2446  + G^1.8  * 0.6720  + B^1.8  * 0.0833)^(1/1.8)
4、ColorMatch RGB [gamma=1.8]
Gray = (R^1.8 * 0.2750  + G^1.8  * 0.6581  + B^1.8  * 0.0670)^(1/1.8)
5、简化 KODAK DC Series Digital Camera [gamma=2.2]
Gray = (R^2.2 * 0.2229  + G^2.2  * 0.7175  + B^2.2  * 0.0595)^(1/2.2)

// 根据rgb值计算灰度  
function getGray(r, g, b) {  
    return 0.299 * r + 0.578 * g + 0.114 * b;  
} 

4.根据灰度生成相应字符
把不同的灰度替换成相应的字符,原则上灰度越深的像素应该用越复杂的字符,具体什么字符可以自由替换,这只是一个测试版本。
代码片段:

// 根据灰度生成相应字符  
function toText(g) {  
    if (g <= 30) {  
        return '8′;  
    } else if (g > 30 && g <= 60) {  
        return '&';  
    } else if (g > 60 && g <= 120) {  
        return '$';  
    }  else if (g > 120 && g <= 150) {  
        return '*';  
    } else if (g > 150 && g <= 180) {  
        return 'o';  
    } else if (g > 180 && g <= 210) {  
        return '!';  
    } else if (g > 210 && g <= 240) {  
        return ';';  
    }  else {  
        return ‘.';  
    }  
} 

到这次我们的工作就完成得差不多啦,上面只给出了一些代码的片段,把原理疏通了一下,具体怎么实现大家可以自由发挥。猛点这里代码下载地址
Javascript 相关文章推荐
Javascript 继承实现例子
Aug 12 Javascript
深入理解JavaScript定时机制
Oct 29 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
Aug 30 Javascript
在JavaScript中调用Java类和接口的方法
Sep 07 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
Nov 02 Javascript
实现JavaScript高性能的数据存储
Dec 11 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
JS简单实现数组去重的方法示例
Mar 27 Javascript
详解React Native网络请求fetch简单封装
Aug 10 Javascript
vue.js路由跳转详解
Aug 28 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
Dec 22 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
Jan 22 Javascript
js编写trim()函数及正则表达式的运用
Oct 24 #Javascript
原生JS实现加入收藏夹的代码
Oct 24 #Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
Oct 24 #Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
Oct 24 #Javascript
js switch case default 的用法示例介绍
Oct 23 #Javascript
js setTimeout opener的用法示例详解
Oct 23 #Javascript
利用jQuery实现可输入搜索文字的下拉框
Oct 23 #Javascript
You might like
PHP.MVC的模板标签系统(二)
2006/09/05 PHP
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python中如何添加自定义模块
2020/06/09 Python
如何解决安装python3.6.1失败
2020/07/01 Python
python爬取天气数据的实例详解
2020/11/20 Python
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
Linux文件操作命令都有哪些
2015/02/27 面试题
什么是设计模式
2012/06/17 面试题
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
会计电算化应届生求职信
2013/11/03 职场文书
元旦联欢会主持词
2014/03/26 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
开天辟地观后感
2015/06/09 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL