通过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 相关文章推荐
google地图的路线实现代码
Aug 20 Javascript
基于JavaScript 下namespace 功能的简单分析
Jul 05 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
Jul 12 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
Nov 23 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
Jan 04 Javascript
Ajax实现不刷新取最新商品
Mar 01 Javascript
jquery与js实现全选功能的区别
Jun 11 jQuery
vue中实现在外部调用methods的方法(推荐)
Feb 08 Javascript
浅析Vue中method与computed的区别
Mar 06 Javascript
浅谈在node.js进入文件目录的问题
May 13 Javascript
详解KOA2如何手写中间件(装饰器模式)
Oct 11 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
Sep 26 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抽象类 介绍
2012/06/13 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
javascript编程起步(第六课)
2007/01/10 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
微信小程序实现顶部导航特效
2019/01/28 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
设置python3为默认python的方法
2018/10/31 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
超简单使用Python换脸实例
2019/03/27 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
Python中无限循环需要什么条件
2020/05/27 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
Python datetime模块的使用示例
2021/02/02 Python
python数据抓取3种方法总结
2021/02/07 Python
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
函授本科自我鉴定
2013/11/03 职场文书
小学语文教研活动总结
2014/07/01 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书