-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconcat.js
117 lines (81 loc) · 2.7 KB
/
concat.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
var async = require('async');
var Canvas = require('canvas');
var Image = Canvas.Image;
function concatImages(options, callback) {
var images = Array.isArray(options) ? options : options.images;
var margin = (typeof options.margin === 'number') ? options.margin : 10;
loadImages(images, function(err, images) {
if(err) return callback(err);
var canvas;
try {
canvas = draw(images, { margin: margin });
} catch(e) {
return callback(e);
}
return callback(null, canvas);
});
};
function concatImagesV(options, callback) {
var images = Array.isArray(options) ? options : options.images;
var margin = (typeof options.margin === 'number') ? options.margin : 10;
loadImages(images, function(err, images) {
if(err) return callback(err);
var canvas;
try {
canvas = drawV(images, { margin: margin });
} catch(e) {
return callback(e);
}
return callback(null, canvas);
});
};
function loadImages(images, callback) {
async.map(images, function(src, done) {
var img = new Image();
img.onload = function() {
done(null, img);
}
img.src = src;
}, callback);
}
function draw(images, options) {
var margin = options.margin;
var totalWidth = (images.length - 1) * margin;
var maxHeight = 0;
for (var i = 0; i < images.length; i++) {
totalWidth += images[i].width;
maxHeight = (images[i].height > maxHeight) ? images[i].height : maxHeight;
};
var canvas = new Canvas.createCanvas(totalWidth, maxHeight);
var ctx = canvas.getContext('2d');
var currentLeftMargin = 0;
for (var i = 0; i < images.length; i++) {
currentLeftMargin = (currentLeftMargin === 0) ? currentLeftMargin : currentLeftMargin + margin;
ctx.drawImage(images[i], currentLeftMargin, 0);
currentLeftMargin += images[i].width;
};
return canvas;
}
function drawV(images, options) {
var margin = options.margin;
var totalHeight = (images.length - 1) * margin;
var maxWidth = 0;
for (var i = 0; i < images.length; i++) {
totalHeight += images[i].height;
maxWidth = (images[i].width > maxWidth) ? images[i].width : maxWidth;
};
var canvas = new Canvas.createCanvas(maxWidth, totalHeight);
var ctx = canvas.getContext('2d');
var currentLeftMargin = 0;
for (var i = 0; i < images.length; i++) {
currentLeftMargin = (currentLeftMargin === 0) ? currentLeftMargin : currentLeftMargin + margin;
ctx.drawImage(images[i], 0, currentLeftMargin);
currentLeftMargin += images[i].height;
};
return canvas;
}
module.exports = concatImages;
module.exports.h = concatImages;
module.exports.v = concatImagesV;
module.exports.draw = draw;
module.exports.loadImages = loadImages;