通过javascript把图片转化为字符画

1.获取上传图片对象数据
Javascript无法直接获取本地上传的图片的数据,html5可以解决这一问题 。html5里面的FileReader interface可以把图片对象的数据读到内存,然后通过接口的进度事件(Progress Events)访问这些数据。
浏览器支持:
- Internet Explorer: 10+
 - Firefox: 10+
 - Chrome: 13+
 - Opera: 12+
 - 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 ‘.’;
 - }
 - }
 
到这次我们的工作就完成得差不多啦,上面只给出了一些代码的片段,把原理疏通了一下,具体怎么实现大家可以自由发挥,下面给出一个示例,把源码也贴出来跟大家分享。
PS:已经把这个demo整合到我博客的小工具里了(通过模板实现)去看看?
通过javascript把图片转化为字符画的更多相关文章
- HTML5将图片转化成字符画
		
HTML5将图片转化成字符画 字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置 ...
 - 基于 canvas 将图片转化成字符画
		
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢? HTML5 让这个可能变成了现实,通过 canvas,可以很轻松实现这个功能. 其实原理很简单:扫描图片相应位置的像素点,再计算出其灰 ...
 - 基于canvas将图片转化成字符画
		
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置的像素点,再计算出其灰度值,根 ...
 - python将图片转化为字符图
		
最近看到将图片转化为字符图的小实验,我觉得很有趣,所以决定自己实现一下. 步骤和原理如下: 读取图片的灰度值矩阵(0-255之间),灰度值矩阵主要反映的是图片的黑白程度,越黑越接近与0,越白越接近于2 ...
 - 将图片转为ASCII字符画
		
原文:将图片转为ASCII字符画 Copyright 2012 Conmajia 源代码下载:点击这里 什么是字符画?就是用ASCII字符来近似组成图像,就像这样: ╭╮ ╭╮ ││ ││ ╭┴┴—— ...
 - python 图片在线转字符画预览
		
文章链接:https://mp.weixin.qq.com/s/yiFOmljhyalE8ssAgwo6Jw 关于python图片转字符画,相信大家都不陌生,经常出现在 n个超有趣的python项目中 ...
 - C#将图片转换成字符画
		
先看一下效果图 在Main方法中调用(首先要添加程序集System.Drawing,然后引入命名空间System.Drawing) ConvertToChar(new Bitmap(@"D: ...
 - Java实现把图片转成字符画
		
1,先看效果图:
 - Python 图片转字符画 学习笔记
		
Python 图片转字符画 学习笔记 标签(空格分隔): Python 声明:此文章和所有代码是学习笔记,非原创,原文教程地址:https://www.shiyanlou.com/courses/37 ...
 
随机推荐
- JUC回顾之-ThreadPoolExecutor的原理和使用
			
Spring中的ThreadPoolTaskExecutor是借助于JDK并发包中的java.util.concurrent.ThreadPoolExecutor来实现的.基于ThreadPoolEx ...
 - ios下划线变量:为什么变量前要加下划线才有用?
			
先看一段代码. 复制代码 appdelegate.h @property (weak) IBOutlet NSMatrix *StockType; @property (weak) IBOutle ...
 - mysql之select(一)
			
select 初始准备工作: 1.建木瓜库并选中 create database mugua; use mugua; 2.创建商品表.栏目表.品牌表 create table goods ( good ...
 - QTP10.0安装说明
			
QTP10.0 安装手册 注:安装之前检查清理相关注册表:运行->regdit-HKEY_LOCAL_MACHINE->HKEY_LOCAL_MACHINE\SOFTWARE->HK ...
 - Yarn上的几个问题整理
			
原文链接 http://xiguada.org/yarn_some_question/  1. NodeManager是如何Kill掉Container的呢? 答,在DefaultConta ...
 - lintcode: 左填充
			
题目 实现一个leftpad库,如果不知道什么是leftpad可以看样例 样例 leftpad("foo", 5) >> " foo" leftpa ...
 - lintcode :最近公共祖先
			
题目 最近公共祖先 给定一棵二叉树,找到两个节点的最近公共父节点(LCA). 最近公共祖先是两个节点的公共的祖先节点且具有最大深度. 样例 对于下面这棵二叉树 4 / \ 3 7 / \ 5 6 LC ...
 - React架构、设计思想
			
一.
 - 针对安卓java入门:数据类型
			
基本数据类型: 布尔型----boolean字符型----char 用单引号整数型----byte(字节型),short(短整型),int(整型),long(长整型)浮点数型--float(浮点型), ...
 - js浮点数的计算
			
js在计算浮点数时可能不够准确,会产生舍入误差的问题,这是使用基于IEEE745数值的浮点计算的通病,并非ECMAScript一家,其他使用相同数值格式的语言也存在这个问题. 这里讲一 ...