通过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 相关文章推荐
获取DOM对象的几种扩展及简写
Oct 09 Javascript
基于JQuery实现CheckBox全选全不选
Jun 27 Javascript
js中哈希表的几种用法总结
Jan 28 Javascript
谈谈JavaScript中function多重理解
Aug 28 Javascript
JavaScript蒙板(model)功能的简单实现代码
Aug 04 Javascript
微信小程序 欢迎页面的制作(源码下载)
Jan 09 Javascript
原生js实现可拖拽效果
Feb 28 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
JavaScript中的一些隐式转换和总结(推荐)
Dec 22 Javascript
vue组件与复用详解
Apr 08 Javascript
对layui中table组件工具栏的使用详解
Sep 19 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
May 01 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
thinkphp模板继承实例简述
2014/11/26 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
php猜单词游戏
2015/09/29 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
jquery访问ashx文件示例代码
2014/08/11 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
Python获取邮件地址的方法
2015/07/10 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
python实现批处理文件
2020/07/28 Python
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
Linux的主要特性
2016/09/03 面试题
电气工程师岗位职责
2014/01/01 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
Java字符串逆序方法详情
2022/03/21 Java/Android
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android
python在package下继续嵌套一个package
2022/04/14 Python
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers