通过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系列(9) 根本没有“JSON对象”这回事!
Jan 15 Javascript
使用JavaScript+canvas实现图片裁剪
Jan 30 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
Jul 01 Javascript
JavaScript中获取纯正的undefined的方法
Mar 06 Javascript
AngularJs入门教程之环境搭建+创建应用示例
Nov 01 Javascript
angular框架实现全选与单选chekbox的自定义
Jul 06 Javascript
jquery实现左右轮播图效果
Sep 28 jQuery
Vue 中mixin 的用法详解
Apr 23 Javascript
Vue 配合eiement动态路由,权限验证的方法
Sep 26 Javascript
Elasticsearch实现复合查询高亮结果功能
Sep 10 Javascript
vue实现节点增删改功能
Sep 26 Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 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调用数据库的存贮过程
2006/10/09 PHP
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
mysql limit查询优化分析
2008/11/12 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
php实现复制移动文件的方法
2015/07/29 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
python基础教程之lambda表达式使用方法
2014/02/12 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
社会学专业学生职业规划书
2014/02/07 职场文书
助残日活动总结
2014/08/27 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
社区综治工作汇报
2014/10/27 职场文书
干部作风建设工作总结
2014/10/29 职场文书
爱心助学感谢信
2015/01/21 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
校长个人总结
2015/03/03 职场文书
python 实现的截屏工具
2021/05/08 Python