-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.js
154 lines (148 loc) · 4.37 KB
/
utils.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
142
143
144
145
146
147
148
149
150
151
152
153
154
let options = {
imageMagick: false,
maxImageSize: 2048,
maxGifSize: 1024,
}
// Exports
module.exports = function(opts) {
Object.assign(options, opts)
var Jimp = require("jimp");
var gm = require("gm");
if (options.imageMagick.toString() == "true") {
gm = gm.subClass({ imageMagick: true });
}
const request = require("request");
function gmToBuffer(gm, useWebp = true, as) {
return new Promise(async (resolve, reject) => {
gm.format({ bufferStream: true }, function (err, format) {
if (format == "WEBP" && !useWebp) format = "PNG";
if (as != undefined) format = as;
this.toBuffer(format, function (err, buffer) {
if (!err) {
resolve(buffer);
} else reject(err);
});
});
});
}
function getFormat(imgUrl) {
return new Promise(async (resolve, reject) => {
gm(request(imgUrl)).format({ bufferStream: true }, function (err, format) {
resolve(format);
});
});
}
function getSize(imgUrl) {
return new Promise(async (resolve, reject) => {
let maxSize = Number(options.maxImageSize);
gm(request(imgUrl)).size(
{ bufferStream: true },
async function (err, size) {
if (err) {
//console.log(err)
reject(err);
} else {
if(maxSize < size.width || maxSize < size.height) {
await this.resize(
maxSize > size.width ? size.width : maxSize,
maxSize > size.height ? size.height : maxSize
);
this.size(
{ bufferStream: true },
async function (err, size) {
if (err) {
//console.log(err)
reject(err);
} else {
resolve([size.width, size.height])
}
});
} else {
resolve([size.width, size.height])
}
}
}
);
});
}
function readURL(imgUrl, useWebp = true, as = undefined) {
return new Promise(async (resolve, reject) => {
try {
let maxSize = Number(options.maxImageSize);
gm(request(imgUrl)).size(
{ bufferStream: true },
async function (err, size) {
if (err) {
//console.log(err)
reject(err);
} else {
if(maxSize < size.width || maxSize < size.height) {
await this.resize(
maxSize > size.width ? size.width : maxSize,
maxSize > size.height ? size.height : maxSize
);
}
resolve(await gmToBuffer(this, useWebp, as));
}
}
);
} catch (e) {
reject(e);
}
});
}
function jimpReadURL(imgUrl) {
return new Promise(async (resolve, reject) => {
try {
let maxSize = Number(options.maxImageSize);
Jimp.read(await readURL(imgUrl, false, undefined))
.then(async (img) => {
if(maxSize < img.bitmap.width || maxSize < img.bitmap.height)
img.scaleToFit(maxSize, maxSize)
resolve(img);
})
.catch(reject);
} catch (e) {
reject(e);
}
});
}
function readBuffer(buffer) {
return new Promise(async (resolve, reject) => {
// Read image type supported by jimp (from buffer)
Jimp.read(buffer)
.then(async (img) => {
resolve(img); // Resolve image
})
.catch(reject);
});
}
function measureText(font, str) {
return new Promise(async (resolve, reject) => {
resolve(await Jimp.measureText(Jimp[font], str)); // Measure text using jimp text, obsolete due to canvas text rendering.
});
}
function measureTextHeight(font, str, width) {
return new Promise(async (resolve, reject) => {
resolve(await Jimp.measureTextHeight(Jimp[font], str, width)); // Measure text height using jimp text, obsolete due to canvas text rendering.
});
}
function loadFont(path) {
return new Promise(async (resolve, reject) => {
Jimp.loadFont(path).then((font) => {
resolve(font); // Load and resolve font using jimp text, obsolete due to canvas text rendering.
});
});
}
return {
readURL,
jimpReadURL,
readBuffer,
measureText,
measureTextHeight,
gmToBuffer,
getFormat,
getSize,
loadFont
}
};