通过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 相关文章推荐
js 可拖动列表实现代码
Dec 13 Javascript
jquery实现网站超链接和图片提示效果
Mar 21 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
Dec 23 Javascript
jquery编写Tab选项卡滚动导航切换特效
Jul 17 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
Dec 31 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
Oct 18 Javascript
解读ES6中class关键字
Nov 20 Javascript
Vue 路由 过渡动效 数据获取方法
Jul 31 Javascript
微信小程序时间标签和时间范围的联动效果
Feb 15 Javascript
简单两步使用node发送qq邮件的方法
Mar 01 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
Apr 27 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
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
python动态参数用法实例分析
2015/05/25 Python
深入解析Python中的上下文管理器
2016/06/28 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
.net面试题
2016/09/17 面试题
领导失职检讨书
2014/02/24 职场文书
经典毕业生求职信
2014/07/12 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
影视后期实训报告
2014/11/05 职场文书
倡议书的格式写法
2015/04/28 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js