forked from guo-yu/ascii
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathascii.js
64 lines (62 loc) · 1.96 KB
/
ascii.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// 感谢 justjavac 的想法启发
// 原文:http://justjavac.com/javascript/2013/09/25/ji-yu-canvas-jiang-tu-pian-zhuan-hua-cheng-zi-fu-hua.html
var Ascii = {
style: "<style type='text/css'>* {margin: 0;padding: 0;} .ascii {font-size: 12px;font-family: simsun;}</style>",
// 按照不同的终端输出
types: {
cli: {
br: '\n',
blank: ' '
},
html: {
br: '</br>',
blank: ' '
}
},
// 根据灰度生成相应字符
toText: function(type, g) {
var self = this;
if (g <= 30) {
return '#';
} 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 self.types[type].blank;
}
},
// 根据rgb值计算灰度
getGray: function(r, g, b) {
return 0.299 * r + 0.578 * g + 0.114 * b;
},
// 初始化
init: function(type, ctx, pic) {
var self = this,
data = ctx.getImageData(0, 0, pic.width, pic.height),
text = '';
for (h = 0; h < data.height; h += 12) {
var p = '';
for (w = 0; w < data.width; w += 6) {
var index = (w + data.width * h) * 4;
var r = data.data[index + 0];
var g = data.data[index + 1];
var b = data.data[index + 2];
var gray = self.getGray(r, g, b);
p += self.toText(type, gray);
}
p += self.types[type].br;
text += p;
}
return (type === 'html') ? self.style + "<div class='ascii'>" + text + '</div>' : text;
}
}
module.exports = Ascii;