通过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 19 Javascript
js读写(删除)Cookie实例详解
Apr 17 Javascript
json的定义、标准格式及json字符串检验
May 11 Javascript
chrome下img加载对height()的影响示例探讨
May 26 Javascript
jQuery中fadeOut()方法用法实例
Dec 24 Javascript
requireJS使用指南
Apr 27 Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 Javascript
基于jQuery实现Accordion手风琴自定义插件
Oct 13 Javascript
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
ES6中异步对象Promise用法详解
Jul 31 Javascript
vue-cli4使用全局less文件中的变量配置操作
Oct 21 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设计模式之结构模式的深入解析
2013/06/13 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
git进行版本控制心得详谈
2017/12/10 Python
Python判断两个对象相等的原理
2017/12/12 Python
python实现电脑自动关机
2018/06/20 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
英国精品买手店:Browns Fashion
2016/09/29 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
公司门卫管理制度
2014/02/01 职场文书
开学典礼主持词
2014/03/19 职场文书
论文评语大全
2014/04/29 职场文书
先进党组织事迹材料
2014/12/26 职场文书
培训学校2015年度工作总结
2015/07/20 职场文书
升学宴学生致辞
2015/07/27 职场文书
公司人事管理制度
2015/08/05 职场文书