通过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 相关文章推荐
jQuery AnythingSlider滑动效果插件
Feb 07 Javascript
js中parseInt函数浅谈
Jul 31 Javascript
firefox浏览器不支持innerText的解决方法
Aug 07 Javascript
avalonjs制作响应式瀑布流特效
May 06 Javascript
javaScript实现可缩放的显示区效果代码
Oct 26 Javascript
基于JavaScript操作DOM常用的API小结
Dec 01 Javascript
JavaScript中循环遍历Array与Map的方法小结
Mar 12 Javascript
Bootstrap开发实战之响应式轮播图
Jun 02 Javascript
webpack常用配置项配置文件介绍
Nov 07 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
Jul 31 Javascript
浅析Vue自定义组件的v-model
Nov 26 Javascript
在移动端使用vue-router和keep-alive的方法示例
Dec 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
常用星际术语索引(新手指南)
2020/03/04 星际争霸
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
php计算年龄精准到年月日
2015/11/17 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
js实现的切换面板实例代码
2013/06/17 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
jQuery中attr()方法用法实例
2015/01/05 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
python处理csv中的空值方法
2018/06/22 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
python实现多进程代码示例
2018/10/31 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
如何基于python实现不邻接植花
2020/05/01 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
材料采购员岗位职责
2013/12/17 职场文书
员工考核管理制度
2014/02/02 职场文书
趵突泉导游词
2015/02/03 职场文书
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python