@wiajs/core 0.1.15 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.common.js +66 -35
- package/dist/core.common.min.js +2 -2
- package/dist/core.esm.js +65 -34
- package/dist/core.esm.min.js +2 -2
- package/dist/core.js +68 -37
- package/dist/core.min.js +2 -2
- package/package.json +2 -3
- package/util/tool.js +21 -14
- package/lib/bmap.js +0 -728
- package/lib/img/compress.js +0 -523
- package/lib/img/util.js +0 -392
package/lib/img/util.js
DELETED
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Fork from https://github.com/fengyuanchen/compressorjs
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
const {slice} = Array.prototype;
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Convert array-like or iterable object to an array.
|
|
9
|
-
* @param {*} value - The value to convert.
|
|
10
|
-
* @returns {Array} Returns a new array.
|
|
11
|
-
*/
|
|
12
|
-
export function toArray(value) {
|
|
13
|
-
return Array.from ? Array.from(value) : slice.call(value);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const REGEXP_IMAGE_TYPE = /^image\/.+$/;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Check if the given value is a mime type of image.
|
|
20
|
-
* @param {*} value - The value to check.
|
|
21
|
-
* @returns {boolean} Returns `true` if the given is a mime type of image, else `false`.
|
|
22
|
-
*/
|
|
23
|
-
export function isImageType(value) {
|
|
24
|
-
return REGEXP_IMAGE_TYPE.test(value);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Convert image type to extension.
|
|
29
|
-
* @param {string} value - The image type to convert.
|
|
30
|
-
* @returns {boolean} Returns the image extension.
|
|
31
|
-
*/
|
|
32
|
-
export function imageTypeToExtension(value) {
|
|
33
|
-
let extension = isImageType(value) ? value.substr(6) : '';
|
|
34
|
-
|
|
35
|
-
if (extension === 'jpeg') {
|
|
36
|
-
extension = 'jpg';
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return `.${extension}`;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const {fromCharCode} = String;
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Get string from char code in data view.
|
|
46
|
-
* @param {DataView} dataView - The data view for read.
|
|
47
|
-
* @param {number} start - The start index.
|
|
48
|
-
* @param {number} length - The read length.
|
|
49
|
-
* @returns {string} The read result.
|
|
50
|
-
*/
|
|
51
|
-
export function getStringFromCharCode(dataView, start, length) {
|
|
52
|
-
let str = '';
|
|
53
|
-
let i;
|
|
54
|
-
|
|
55
|
-
length += start;
|
|
56
|
-
|
|
57
|
-
for (i = start; i < length; i += 1) {
|
|
58
|
-
str += fromCharCode(dataView.getUint8(i));
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return str;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const {btoa} = window;
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Transform array buffer to Data URL.
|
|
68
|
-
* @param {ArrayBuffer} arrayBuffer - The array buffer to transform.
|
|
69
|
-
* @param {string} mimeType - The mime type of the Data URL.
|
|
70
|
-
* @returns {string} The result Data URL.
|
|
71
|
-
*/
|
|
72
|
-
export function arrayBufferToDataURL(arrayBuffer, mimeType) {
|
|
73
|
-
const chunks = [];
|
|
74
|
-
const chunkSize = 8192;
|
|
75
|
-
let uint8 = new Uint8Array(arrayBuffer);
|
|
76
|
-
|
|
77
|
-
while (uint8.length > 0) {
|
|
78
|
-
// XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9
|
|
79
|
-
// eslint-disable-next-line prefer-spread
|
|
80
|
-
chunks.push(
|
|
81
|
-
fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize)))
|
|
82
|
-
);
|
|
83
|
-
uint8 = uint8.subarray(chunkSize);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return `data:${mimeType};base64,${btoa(chunks.join(''))}`;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Get orientation value from given array buffer.
|
|
91
|
-
* @param {ArrayBuffer} arrayBuffer - The array buffer to read.
|
|
92
|
-
* @returns {number} The read orientation value.
|
|
93
|
-
*/
|
|
94
|
-
export function resetAndGetOrientation(arrayBuffer) {
|
|
95
|
-
const dataView = new DataView(arrayBuffer);
|
|
96
|
-
let orientation;
|
|
97
|
-
|
|
98
|
-
// Ignores range error when the image does not have correct Exif information
|
|
99
|
-
try {
|
|
100
|
-
let littleEndian;
|
|
101
|
-
let app1Start;
|
|
102
|
-
let ifdStart;
|
|
103
|
-
|
|
104
|
-
// Only handle JPEG image (start by 0xFFD8)
|
|
105
|
-
if (dataView.getUint8(0) === 0xff && dataView.getUint8(1) === 0xd8) {
|
|
106
|
-
const length = dataView.byteLength;
|
|
107
|
-
let offset = 2;
|
|
108
|
-
|
|
109
|
-
while (offset + 1 < length) {
|
|
110
|
-
if (
|
|
111
|
-
dataView.getUint8(offset) === 0xff &&
|
|
112
|
-
dataView.getUint8(offset + 1) === 0xe1
|
|
113
|
-
) {
|
|
114
|
-
app1Start = offset;
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
offset += 1;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (app1Start) {
|
|
123
|
-
const exifIDCode = app1Start + 4;
|
|
124
|
-
const tiffOffset = app1Start + 10;
|
|
125
|
-
|
|
126
|
-
if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {
|
|
127
|
-
const endianness = dataView.getUint16(tiffOffset);
|
|
128
|
-
|
|
129
|
-
littleEndian = endianness === 0x4949;
|
|
130
|
-
|
|
131
|
-
if (littleEndian || endianness === 0x4d4d /* bigEndian */) {
|
|
132
|
-
if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002a) {
|
|
133
|
-
const firstIFDOffset = dataView.getUint32(
|
|
134
|
-
tiffOffset + 4,
|
|
135
|
-
littleEndian
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
if (firstIFDOffset >= 0x00000008) {
|
|
139
|
-
ifdStart = tiffOffset + firstIFDOffset;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (ifdStart) {
|
|
147
|
-
const length = dataView.getUint16(ifdStart, littleEndian);
|
|
148
|
-
let offset;
|
|
149
|
-
let i;
|
|
150
|
-
|
|
151
|
-
for (i = 0; i < length; i += 1) {
|
|
152
|
-
offset = ifdStart + i * 12 + 2;
|
|
153
|
-
|
|
154
|
-
if (
|
|
155
|
-
dataView.getUint16(offset, littleEndian) === 0x0112 /* Orientation */
|
|
156
|
-
) {
|
|
157
|
-
// 8 is the offset of the current tag's value
|
|
158
|
-
offset += 8;
|
|
159
|
-
|
|
160
|
-
// Get the original orientation value
|
|
161
|
-
orientation = dataView.getUint16(offset, littleEndian);
|
|
162
|
-
|
|
163
|
-
// Override the orientation with its default value
|
|
164
|
-
dataView.setUint16(offset, 1, littleEndian);
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
} catch (e) {
|
|
170
|
-
orientation = 1;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return orientation;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Parse Exif Orientation value.
|
|
178
|
-
* @param {number} orientation - The orientation to parse.
|
|
179
|
-
* @returns {Object} The parsed result.
|
|
180
|
-
*/
|
|
181
|
-
export function parseOrientation(orientation) {
|
|
182
|
-
let rotate = 0;
|
|
183
|
-
let scaleX = 1;
|
|
184
|
-
let scaleY = 1;
|
|
185
|
-
|
|
186
|
-
switch (orientation) {
|
|
187
|
-
// Flip horizontal
|
|
188
|
-
case 2:
|
|
189
|
-
scaleX = -1;
|
|
190
|
-
break;
|
|
191
|
-
|
|
192
|
-
// Rotate left 180°
|
|
193
|
-
case 3:
|
|
194
|
-
rotate = -180;
|
|
195
|
-
break;
|
|
196
|
-
|
|
197
|
-
// Flip vertical
|
|
198
|
-
case 4:
|
|
199
|
-
scaleY = -1;
|
|
200
|
-
break;
|
|
201
|
-
|
|
202
|
-
// Flip vertical and rotate right 90°
|
|
203
|
-
case 5:
|
|
204
|
-
rotate = 90;
|
|
205
|
-
scaleY = -1;
|
|
206
|
-
break;
|
|
207
|
-
|
|
208
|
-
// Rotate right 90°
|
|
209
|
-
case 6:
|
|
210
|
-
rotate = 90;
|
|
211
|
-
break;
|
|
212
|
-
|
|
213
|
-
// Flip horizontal and rotate right 90°
|
|
214
|
-
case 7:
|
|
215
|
-
rotate = 90;
|
|
216
|
-
scaleX = -1;
|
|
217
|
-
break;
|
|
218
|
-
|
|
219
|
-
// Rotate left 90°
|
|
220
|
-
case 8:
|
|
221
|
-
rotate = -90;
|
|
222
|
-
break;
|
|
223
|
-
|
|
224
|
-
default:
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
return {
|
|
228
|
-
rotate,
|
|
229
|
-
scaleX,
|
|
230
|
-
scaleY,
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
const REGEXP_DECIMALS = /\.\d*(?:0|9){12}\d*$/;
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Normalize decimal number.
|
|
238
|
-
* Check out {@link https://0.30000000000000004.com/}
|
|
239
|
-
* @param {number} value - The value to normalize.
|
|
240
|
-
* @param {number} [times=100000000000] - The times for normalizing.
|
|
241
|
-
* @returns {number} Returns the normalized number.
|
|
242
|
-
*/
|
|
243
|
-
export function normalizeDecimalNumber(value, times = 100000000000) {
|
|
244
|
-
return REGEXP_DECIMALS.test(value)
|
|
245
|
-
? Math.round(value * times) / times
|
|
246
|
-
: value;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
export function isBlob(input) {
|
|
250
|
-
if (typeof Blob === 'undefined') {
|
|
251
|
-
return false;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return (
|
|
255
|
-
input instanceof Blob ||
|
|
256
|
-
Object.prototype.toString.call(input) === '[object Blob]'
|
|
257
|
-
);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* for img compress
|
|
262
|
-
* canvas.toBlob(callback, type, encoderOptions);
|
|
263
|
-
* A low performance polyfill based on toDataURL.
|
|
264
|
-
* JavaScript Canvas to Blob
|
|
265
|
-
* https://github.com/blueimp/JavaScript-Canvas-to-Blob
|
|
266
|
-
*/
|
|
267
|
-
export function toBlob() {
|
|
268
|
-
if (typeof window === 'undefined') return;
|
|
269
|
-
|
|
270
|
-
const CanvasPrototype =
|
|
271
|
-
window.HTMLCanvasElement && window.HTMLCanvasElement.prototype;
|
|
272
|
-
|
|
273
|
-
const hasBlobConstructor =
|
|
274
|
-
window.Blob &&
|
|
275
|
-
(function () {
|
|
276
|
-
try {
|
|
277
|
-
return Boolean(new Blob());
|
|
278
|
-
} catch (e) {
|
|
279
|
-
return false;
|
|
280
|
-
}
|
|
281
|
-
})();
|
|
282
|
-
|
|
283
|
-
const hasArrayBufferViewSupport =
|
|
284
|
-
hasBlobConstructor &&
|
|
285
|
-
window.Uint8Array &&
|
|
286
|
-
(function () {
|
|
287
|
-
try {
|
|
288
|
-
return new Blob([new Uint8Array(100)]).size === 100;
|
|
289
|
-
} catch (e) {
|
|
290
|
-
return false;
|
|
291
|
-
}
|
|
292
|
-
})();
|
|
293
|
-
|
|
294
|
-
const BlobBuilder =
|
|
295
|
-
window.BlobBuilder ||
|
|
296
|
-
window.WebKitBlobBuilder ||
|
|
297
|
-
window.MozBlobBuilder ||
|
|
298
|
-
window.MSBlobBuilder;
|
|
299
|
-
|
|
300
|
-
const dataURIPattern = /^data:((.*?)(;charset=.*?)?)(;base64)?,/;
|
|
301
|
-
|
|
302
|
-
const dataURLtoBlob =
|
|
303
|
-
(hasBlobConstructor || BlobBuilder) &&
|
|
304
|
-
window.atob &&
|
|
305
|
-
window.ArrayBuffer &&
|
|
306
|
-
window.Uint8Array &&
|
|
307
|
-
function (dataURI) {
|
|
308
|
-
// let matches,
|
|
309
|
-
// mediaType,
|
|
310
|
-
// isBase64,
|
|
311
|
-
// dataString,
|
|
312
|
-
// byteString,
|
|
313
|
-
// arrayBuffer,
|
|
314
|
-
// intArray,
|
|
315
|
-
// i,
|
|
316
|
-
// bb;
|
|
317
|
-
let byteString;
|
|
318
|
-
|
|
319
|
-
// Parse the dataURI components as per RFC 2397
|
|
320
|
-
const matches = dataURI.match(dataURIPattern);
|
|
321
|
-
if (!matches) {
|
|
322
|
-
throw new Error('invalid data URI');
|
|
323
|
-
}
|
|
324
|
-
// Default to text/plain;charset=US-ASCII
|
|
325
|
-
const mediaType = matches[2]
|
|
326
|
-
? matches[1]
|
|
327
|
-
: 'text/plain' + (matches[3] || ';charset=US-ASCII');
|
|
328
|
-
const isBase64 = !!matches[4];
|
|
329
|
-
const dataString = dataURI.slice(matches[0].length);
|
|
330
|
-
if (isBase64) {
|
|
331
|
-
// Convert base64 to raw binary data held in a string:
|
|
332
|
-
byteString = atob(dataString);
|
|
333
|
-
} else {
|
|
334
|
-
// Convert base64/URLEncoded data component to raw binary:
|
|
335
|
-
byteString = decodeURIComponent(dataString);
|
|
336
|
-
}
|
|
337
|
-
// Write the bytes of the string to an ArrayBuffer:
|
|
338
|
-
const arrayBuffer = new ArrayBuffer(byteString.length);
|
|
339
|
-
const intArray = new Uint8Array(arrayBuffer);
|
|
340
|
-
for (let i = 0; i < byteString.length; i += 1) {
|
|
341
|
-
intArray[i] = byteString.charCodeAt(i);
|
|
342
|
-
}
|
|
343
|
-
// Write the ArrayBuffer (or ArrayBufferView) to a blob:
|
|
344
|
-
if (hasBlobConstructor) {
|
|
345
|
-
return new Blob([hasArrayBufferViewSupport ? intArray : arrayBuffer], {
|
|
346
|
-
type: mediaType,
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
const bb = new BlobBuilder();
|
|
350
|
-
bb.append(arrayBuffer);
|
|
351
|
-
return bb.getBlob(mediaType);
|
|
352
|
-
};
|
|
353
|
-
|
|
354
|
-
if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
|
|
355
|
-
if (CanvasPrototype.mozGetAsFile) {
|
|
356
|
-
CanvasPrototype.toBlob = function (callback, type, quality) {
|
|
357
|
-
const self = this;
|
|
358
|
-
setTimeout(function () {
|
|
359
|
-
if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {
|
|
360
|
-
callback(dataURLtoBlob(self.toDataURL(type, quality)));
|
|
361
|
-
} else {
|
|
362
|
-
callback(self.mozGetAsFile('blob', type));
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
};
|
|
366
|
-
} else if (CanvasPrototype.toDataURL && dataURLtoBlob) {
|
|
367
|
-
if (CanvasPrototype.msToBlob) {
|
|
368
|
-
CanvasPrototype.toBlob = function (callback, type, quality) {
|
|
369
|
-
const self = this;
|
|
370
|
-
setTimeout(function () {
|
|
371
|
-
if (
|
|
372
|
-
((type && type !== 'image/png') || quality) &&
|
|
373
|
-
CanvasPrototype.toDataURL &&
|
|
374
|
-
dataURLtoBlob
|
|
375
|
-
) {
|
|
376
|
-
callback(dataURLtoBlob(self.toDataURL(type, quality)));
|
|
377
|
-
} else {
|
|
378
|
-
callback(self.msToBlob(type));
|
|
379
|
-
}
|
|
380
|
-
});
|
|
381
|
-
};
|
|
382
|
-
} else {
|
|
383
|
-
CanvasPrototype.toBlob = function (callback, type, quality) {
|
|
384
|
-
const self = this;
|
|
385
|
-
setTimeout(function () {
|
|
386
|
-
callback(dataURLtoBlob(self.toDataURL(type, quality)));
|
|
387
|
-
});
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|