/
index.js
executable file
·141 lines (121 loc) · 3.05 KB
/
index.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
var fs = require('fs')
, m = require('nm-m')
, lwip = require('lwip')
, async = require('async')
, mkdirp = require('mkdirp')
var methods = {
decodeBase64: function decodeBase64Image(dataString) {
var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/);
var response = {};
if (matches.length !== 3) {
return new Error('Invalid input string');
}
response.type = matches[1];
response.data = new Buffer(matches[2], 'base64');
return response;
},
get_extention: function (type) {
var arr = type.split('/')
return arr[1]
},
save: function (params, ecb, scb) {
var buffer = params.buffer || this.decodeBase64(params.base64)
var name = params.name,
dir = params.dir + '/',
path = params.path + '/'
dir = dir.replace(/\/\//gi, '')
path = path.replace(/\/\//gi, '')
var abs_dir = dir + path,
crop = params.crop,
ext = this.get_extention(buffer.type),
file_name = name + '.' + ext,
abs_file_name = abs_dir + name + '.' + ext
var image
function get_mw_mh(w, h, params) {
params = params || {}
var max_width = params.max_width,
max_height = params.max_height
var kw = max_width ? w / max_width : 1
var kh = max_height ? h / max_height : 1
var k = Math.max(kw, kh, 1)
var new_w = Math.round(w / k)
var new_h = Math.round(h / k)
return {
k: k,
new_w: new_w,
new_h: new_h,
kw: kw,
kh: kh
}
}
function _cb_handler(cb) {
return function (err, _image) {
if (err) {
return cb(err)
}
image = _image
cb()
}
}
async.series({
mkdirp: function (cb) {
mkdirp(abs_dir, cb)
},
fs_writefile: function (cb) {
fs.writeFile(abs_file_name, buffer.data, cb)
},
lwip_open: function (cb) {
lwip.open(abs_file_name, _cb_handler(cb))
},
lwip_crop: function (cb) {
if (crop) {
var crop_k_w = crop.x || crop.w || 1
, crop_k_h = crop.y || crop.h || 1
, _w = image.width() / crop_k_w
, _h = image.height() / crop_k_h
var _min_wh = Math.min(_w, _h)
var _w_new = Math.round(_min_wh * crop_k_w)
var _h_new = Math.round(_min_wh * crop_k_h)
image.crop(_w_new, _h_new, _cb_handler(cb))
} else {
cb()
}
},
lwip_resize: function(cb) {
var w = image.width()
, h = image.height()
, wh = get_mw_mh(w, h, params);
if ((w == wh.new_w) && (h == wh.new_h)) {
cb()
} else {
image.resize(wh.new_w, wh.new_h, 'lanczos', _cb_handler(cb))
}
},
write_file: function(cb) {
image.writeFile(abs_file_name, cb)
},
data: function(cb){
cb(null, {
image: image,
w: image.width(),
h: image.height(),
url: path + file_name,
file_name: file_name,
abs_file_dir: abs_dir,
abs_file_name: abs_dir + file_name
})
}
},
function (err, r) {
if (err) {
m.ecb(300, err, ecb)
} else {
var _data = r.data
r.image = _data.image
delete _data.image
m.scb(_data, scb)
}
});
}
}
module.exports = methods;