通过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 相关文章推荐
25个好玩的JavaScript小游戏分享
Apr 22 Javascript
window.open 以post方式传递参数示例代码
Feb 27 Javascript
iframe调用父页面函数示例详解
Jul 17 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
Aug 22 Javascript
jquery实现的table排序功能示例
Mar 10 Javascript
详解vue-router基本使用
Apr 18 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 Javascript
每个 JavaScript 工程师都应懂的33个概念
Oct 22 Javascript
扫微信小程序码实现网站登陆实现解析
Aug 20 Javascript
vue 兄弟组件的信息传递的方法实例详解
Aug 30 Javascript
JS如何在数组指定位置插入元素
Mar 10 Javascript
vue中的.$mount('#app')手动挂载操作
Sep 02 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中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
PHP5函数小全(分享)
2013/06/06 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
nodejs实用示例 缩址还原
2010/12/28 NodeJs
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Python面向对象之Web静态服务器
2019/09/03 Python
python统计文章中单词出现次数实例
2020/02/27 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
Champion官网:美国冠军运动服装
2017/01/25 全球购物
什么是聚集索引和非聚集索引
2012/01/17 面试题
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
给孩子的新年寄语
2014/04/08 职场文书
大二学习计划书范文
2014/04/27 职场文书
英语教师个人工作总结
2015/02/09 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
vue使用watch监听属性变化
2022/04/30 Vue.js
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android