ngx-image-cropper 5.0.1 → 6.0.0
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/README.md +1 -0
- package/esm2020/lib/component/image-cropper.component.mjs +540 -0
- package/esm2020/lib/image-cropper.module.mjs +26 -0
- package/esm2020/lib/interfaces/cropper-options.interface.mjs +2 -0
- package/esm2020/lib/interfaces/cropper-position.interface.mjs +2 -0
- package/esm2020/lib/interfaces/cropper.settings.mjs +50 -0
- package/esm2020/lib/interfaces/dimensions.interface.mjs +2 -0
- package/esm2020/lib/interfaces/exif-transform.interface.mjs +2 -0
- package/esm2020/lib/interfaces/image-cropped-event.interface.mjs +2 -0
- package/esm2020/lib/interfaces/image-transform.interface.mjs +2 -0
- package/esm2020/lib/interfaces/index.mjs +2 -0
- package/esm2020/lib/interfaces/loaded-image.interface.mjs +2 -0
- package/esm2020/lib/interfaces/move-start.interface.mjs +7 -0
- package/esm2020/lib/services/crop.service.mjs +117 -0
- package/esm2020/lib/services/cropper-position.service.mjs +201 -0
- package/esm2020/lib/services/load-image.service.mjs +168 -0
- package/esm2020/lib/utils/blob.utils.mjs +12 -0
- package/esm2020/lib/utils/exif.utils.mjs +89 -0
- package/esm2020/lib/utils/hammer.utils.mjs +2 -0
- package/esm2020/lib/utils/keyboard.utils.mjs +40 -0
- package/esm2020/lib/utils/resize.utils.mjs +75 -0
- package/esm2020/ngx-image-cropper.mjs +5 -0
- package/esm2020/public-api.mjs +6 -0
- package/fesm2015/{ngx-image-cropper.js → ngx-image-cropper.mjs} +250 -1034
- package/fesm2015/ngx-image-cropper.mjs.map +1 -0
- package/fesm2020/ngx-image-cropper.mjs +1315 -0
- package/fesm2020/ngx-image-cropper.mjs.map +1 -0
- package/lib/component/image-cropper.component.d.ts +12 -9
- package/lib/image-cropper.module.d.ts +6 -0
- package/lib/interfaces/cropper.settings.d.ts +1 -1
- package/lib/services/crop.service.d.ts +3 -0
- package/lib/services/cropper-position.service.d.ts +3 -0
- package/lib/services/load-image.service.d.ts +3 -0
- package/lib/utils/hammer.utils.d.ts +1 -1
- package/ngx-image-cropper.d.ts +1 -3
- package/package.json +22 -10
- package/bundles/ngx-image-cropper.umd.js +0 -2418
- package/bundles/ngx-image-cropper.umd.js.map +0 -1
- package/bundles/ngx-image-cropper.umd.min.js +0 -16
- package/bundles/ngx-image-cropper.umd.min.js.map +0 -1
- package/esm2015/lib/component/image-cropper.component.js +0 -827
- package/esm2015/lib/image-cropper.module.js +0 -24
- package/esm2015/lib/interfaces/cropper-options.interface.js +0 -56
- package/esm2015/lib/interfaces/cropper-position.interface.js +0 -20
- package/esm2015/lib/interfaces/cropper.settings.js +0 -140
- package/esm2015/lib/interfaces/dimensions.interface.js +0 -16
- package/esm2015/lib/interfaces/exif-transform.interface.js +0 -16
- package/esm2015/lib/interfaces/image-cropped-event.interface.js +0 -24
- package/esm2015/lib/interfaces/image-transform.interface.js +0 -20
- package/esm2015/lib/interfaces/index.js +0 -6
- package/esm2015/lib/interfaces/loaded-image.interface.js +0 -18
- package/esm2015/lib/interfaces/move-start.interface.js +0 -37
- package/esm2015/lib/services/crop.service.js +0 -176
- package/esm2015/lib/services/cropper-position.service.js +0 -259
- package/esm2015/lib/services/load-image.service.js +0 -304
- package/esm2015/lib/utils/blob.utils.js +0 -26
- package/esm2015/lib/utils/exif.utils.js +0 -128
- package/esm2015/lib/utils/hammer.utils.js +0 -29
- package/esm2015/lib/utils/keyboard.utils.js +0 -58
- package/esm2015/lib/utils/resize.utils.js +0 -116
- package/esm2015/ngx-image-cropper.js +0 -13
- package/esm2015/public-api.js +0 -11
- package/fesm2015/ngx-image-cropper.js.map +0 -1
- package/ngx-image-cropper.metadata.json +0 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class LoadImageService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.autoRotateSupported = supportsAutomaticRotation();
|
|
7
|
+
}
|
|
8
|
+
loadImageFile(file, cropperSettings) {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const fileReader = new FileReader();
|
|
11
|
+
fileReader.onload = (event) => {
|
|
12
|
+
this.loadImage(event.target.result, file.type, cropperSettings)
|
|
13
|
+
.then(resolve)
|
|
14
|
+
.catch(reject);
|
|
15
|
+
};
|
|
16
|
+
fileReader.readAsDataURL(file);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
loadImage(imageBase64, imageType, cropperSettings) {
|
|
20
|
+
if (!this.isValidImageType(imageType)) {
|
|
21
|
+
return Promise.reject(new Error('Invalid image type'));
|
|
22
|
+
}
|
|
23
|
+
return this.loadBase64Image(imageBase64, cropperSettings);
|
|
24
|
+
}
|
|
25
|
+
isValidImageType(type) {
|
|
26
|
+
return /image\/(png|jpg|jpeg|bmp|gif|tiff|webp)/.test(type);
|
|
27
|
+
}
|
|
28
|
+
loadImageFromURL(url, cropperSettings) {
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
const img = new Image();
|
|
31
|
+
img.onerror = () => reject;
|
|
32
|
+
img.onload = () => {
|
|
33
|
+
const canvas = document.createElement('canvas');
|
|
34
|
+
const context = canvas.getContext('2d');
|
|
35
|
+
canvas.width = img.width;
|
|
36
|
+
canvas.height = img.height;
|
|
37
|
+
context?.drawImage(img, 0, 0);
|
|
38
|
+
this.loadBase64Image(canvas.toDataURL(), cropperSettings).then(resolve);
|
|
39
|
+
};
|
|
40
|
+
img.crossOrigin = 'anonymous';
|
|
41
|
+
img.src = url;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
loadBase64Image(imageBase64, cropperSettings) {
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
const originalImage = new Image();
|
|
47
|
+
originalImage.onload = () => resolve({
|
|
48
|
+
originalImage,
|
|
49
|
+
originalBase64: imageBase64
|
|
50
|
+
});
|
|
51
|
+
originalImage.onerror = reject;
|
|
52
|
+
originalImage.src = imageBase64;
|
|
53
|
+
}).then((res) => this.transformImageBase64(res, cropperSettings));
|
|
54
|
+
}
|
|
55
|
+
async transformImageBase64(res, cropperSettings) {
|
|
56
|
+
const autoRotate = await this.autoRotateSupported;
|
|
57
|
+
const exifTransform = await getTransformationsFromExifData(autoRotate ? -1 : res.originalBase64);
|
|
58
|
+
if (!res.originalImage || !res.originalImage.complete) {
|
|
59
|
+
return Promise.reject(new Error('No image loaded'));
|
|
60
|
+
}
|
|
61
|
+
const loadedImage = {
|
|
62
|
+
original: {
|
|
63
|
+
base64: res.originalBase64,
|
|
64
|
+
image: res.originalImage,
|
|
65
|
+
size: {
|
|
66
|
+
width: res.originalImage.naturalWidth,
|
|
67
|
+
height: res.originalImage.naturalHeight
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
exifTransform
|
|
71
|
+
};
|
|
72
|
+
return this.transformLoadedImage(loadedImage, cropperSettings);
|
|
73
|
+
}
|
|
74
|
+
async transformLoadedImage(loadedImage, cropperSettings) {
|
|
75
|
+
const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform.rotate;
|
|
76
|
+
const originalSize = {
|
|
77
|
+
width: loadedImage.original.image.naturalWidth,
|
|
78
|
+
height: loadedImage.original.image.naturalHeight
|
|
79
|
+
};
|
|
80
|
+
if (canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperSettings.containWithinAspectRatio) {
|
|
81
|
+
return {
|
|
82
|
+
original: {
|
|
83
|
+
base64: loadedImage.original.base64,
|
|
84
|
+
image: loadedImage.original.image,
|
|
85
|
+
size: { ...originalSize }
|
|
86
|
+
},
|
|
87
|
+
transformed: {
|
|
88
|
+
base64: loadedImage.original.base64,
|
|
89
|
+
image: loadedImage.original.image,
|
|
90
|
+
size: { ...originalSize }
|
|
91
|
+
},
|
|
92
|
+
exifTransform: loadedImage.exifTransform
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform, cropperSettings);
|
|
96
|
+
const canvas = document.createElement('canvas');
|
|
97
|
+
canvas.width = transformedSize.width;
|
|
98
|
+
canvas.height = transformedSize.height;
|
|
99
|
+
const ctx = canvas.getContext('2d');
|
|
100
|
+
ctx?.setTransform(loadedImage.exifTransform.flip ? -1 : 1, 0, 0, 1, canvas.width / 2, canvas.height / 2);
|
|
101
|
+
ctx?.rotate(Math.PI * (canvasRotation / 2));
|
|
102
|
+
ctx?.drawImage(loadedImage.original.image, -originalSize.width / 2, -originalSize.height / 2);
|
|
103
|
+
const transformedBase64 = canvas.toDataURL();
|
|
104
|
+
const transformedImage = await this.loadImageFromBase64(transformedBase64);
|
|
105
|
+
return {
|
|
106
|
+
original: {
|
|
107
|
+
base64: loadedImage.original.base64,
|
|
108
|
+
image: loadedImage.original.image,
|
|
109
|
+
size: { ...originalSize }
|
|
110
|
+
},
|
|
111
|
+
transformed: {
|
|
112
|
+
base64: transformedBase64,
|
|
113
|
+
image: transformedImage,
|
|
114
|
+
size: {
|
|
115
|
+
width: transformedImage.width,
|
|
116
|
+
height: transformedImage.height
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
exifTransform: loadedImage.exifTransform
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
loadImageFromBase64(imageBase64) {
|
|
123
|
+
return new Promise(((resolve, reject) => {
|
|
124
|
+
const image = new Image();
|
|
125
|
+
image.onload = () => resolve(image);
|
|
126
|
+
image.onerror = reject;
|
|
127
|
+
image.src = imageBase64;
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
getTransformedSize(originalSize, exifTransform, cropperSettings) {
|
|
131
|
+
const canvasRotation = cropperSettings.canvasRotation + exifTransform.rotate;
|
|
132
|
+
if (cropperSettings.containWithinAspectRatio) {
|
|
133
|
+
if (canvasRotation % 2) {
|
|
134
|
+
const minWidthToContain = originalSize.width * cropperSettings.aspectRatio;
|
|
135
|
+
const minHeightToContain = originalSize.height / cropperSettings.aspectRatio;
|
|
136
|
+
return {
|
|
137
|
+
width: Math.max(originalSize.height, minWidthToContain),
|
|
138
|
+
height: Math.max(originalSize.width, minHeightToContain)
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
const minWidthToContain = originalSize.height * cropperSettings.aspectRatio;
|
|
143
|
+
const minHeightToContain = originalSize.width / cropperSettings.aspectRatio;
|
|
144
|
+
return {
|
|
145
|
+
width: Math.max(originalSize.width, minWidthToContain),
|
|
146
|
+
height: Math.max(originalSize.height, minHeightToContain)
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (canvasRotation % 2) {
|
|
151
|
+
return {
|
|
152
|
+
height: originalSize.width,
|
|
153
|
+
width: originalSize.height
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
width: originalSize.width,
|
|
158
|
+
height: originalSize.height
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
LoadImageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LoadImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
163
|
+
LoadImageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LoadImageService, providedIn: 'root' });
|
|
164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: LoadImageService, decorators: [{
|
|
165
|
+
type: Injectable,
|
|
166
|
+
args: [{ providedIn: 'root' }]
|
|
167
|
+
}] });
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1pbWFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9sb2FkLWltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFRaEcsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUdVLHdCQUFtQixHQUFxQix5QkFBeUIsRUFBRSxDQUFDO0tBbUw3RTtJQWpMQyxhQUFhLENBQUMsSUFBVSxFQUFFLGVBQWdDO1FBQ3hELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNwQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUM7cUJBQzVELElBQUksQ0FBQyxPQUFPLENBQUM7cUJBQ2IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQztZQUNGLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sU0FBUyxDQUFDLFdBQW1CLEVBQUUsU0FBaUIsRUFBRSxlQUFnQztRQUN4RixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxvQkFB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Q0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQztpQkFDekQsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDO2dCQUM1RSxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQztnQkFDNUUsT0FBTztvQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDO29CQUN0RCxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDO2lCQUMxRCxDQUFDO2FBQ0g7U0FDRjtRQUVELElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtZQUN0QixPQUFPO2dCQUNMLE1BQU0sRUFBRSxZQUFZLENBQUMsS0FBSztnQkFDMUIsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNO2FBQzNCLENBQUM7U0FDSDtRQUNELE9BQU87WUFDTCxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7WUFDekIsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO1NBQzVCLENBQUM7SUFDSixDQUFDOzs2R0FwTFUsZ0JBQWdCO2lIQUFoQixnQkFBZ0IsY0FESixNQUFNOzJGQUNsQixnQkFBZ0I7a0JBRDVCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGltZW5zaW9ucywgTG9hZGVkSW1hZ2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENyb3BwZXJTZXR0aW5ncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY3JvcHBlci5zZXR0aW5ncyc7XG5pbXBvcnQgeyBFeGlmVHJhbnNmb3JtIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leGlmLXRyYW5zZm9ybS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0VHJhbnNmb3JtYXRpb25zRnJvbUV4aWZEYXRhLCBzdXBwb3J0c0F1dG9tYXRpY1JvdGF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXhpZi51dGlscyc7XG5cbmludGVyZmFjZSBMb2FkSW1hZ2VCYXNlNjQge1xuICBvcmlnaW5hbEltYWdlOiBIVE1MSW1hZ2VFbGVtZW50O1xuICBvcmlnaW5hbEJhc2U2NDogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBMb2FkSW1hZ2VTZXJ2aWNlIHtcblxuICBwcml2YXRlIGF1dG9Sb3RhdGVTdXBwb3J0ZWQ6IFByb21pc2U8Ym9vbGVhbj4gPSBzdXBwb3J0c0F1dG9tYXRpY1JvdGF0aW9uKCk7XG5cbiAgbG9hZEltYWdlRmlsZShmaWxlOiBGaWxlLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZEltYWdlKGV2ZW50LnRhcmdldC5yZXN1bHQsIGZpbGUudHlwZSwgY3JvcHBlclNldHRpbmdzKVxuICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgICB9O1xuICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkSW1hZ2UoaW1hZ2VCYXNlNjQ6IHN0cmluZywgaW1hZ2VUeXBlOiBzdHJpbmcsIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkSW1hZ2VUeXBlKGltYWdlVHlwZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0ludmFsaWQgaW1hZ2UgdHlwZScpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9hZEJhc2U2NEltYWdlKGltYWdlQmFzZTY0LCBjcm9wcGVyU2V0dGluZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkSW1hZ2VUeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvaW1hZ2VcXC8ocG5nfGpwZ3xqcGVnfGJtcHxnaWZ8dGlmZnx3ZWJwKS8udGVzdCh0eXBlKTtcbiAgfVxuXG4gIGxvYWRJbWFnZUZyb21VUkwodXJsOiBzdHJpbmcsIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gcmVqZWN0O1xuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICAgICAgY29udGV4dD8uZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgIHRoaXMubG9hZEJhc2U2NEltYWdlKGNhbnZhcy50b0RhdGFVUkwoKSwgY3JvcHBlclNldHRpbmdzKS50aGVuKHJlc29sdmUpO1xuICAgICAgfTtcbiAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgaW1nLnNyYyA9IHVybDtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRCYXNlNjRJbWFnZShpbWFnZUJhc2U2NDogc3RyaW5nLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8TG9hZEltYWdlQmFzZTY0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbEltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICBvcmlnaW5hbEltYWdlLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoe1xuICAgICAgICBvcmlnaW5hbEltYWdlLFxuICAgICAgICBvcmlnaW5hbEJhc2U2NDogaW1hZ2VCYXNlNjRcbiAgICAgIH0pO1xuICAgICAgb3JpZ2luYWxJbWFnZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgb3JpZ2luYWxJbWFnZS5zcmMgPSBpbWFnZUJhc2U2NDtcbiAgICB9KS50aGVuKChyZXM6IExvYWRJbWFnZUJhc2U2NCkgPT4gdGhpcy50cmFuc2Zvcm1JbWFnZUJhc2U2NChyZXMsIGNyb3BwZXJTZXR0aW5ncykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cmFuc2Zvcm1JbWFnZUJhc2U2NChyZXM6IExvYWRJbWFnZUJhc2U2NCwgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgY29uc3QgYXV0b1JvdGF0ZSA9IGF3YWl0IHRoaXMuYXV0b1JvdGF0ZVN1cHBvcnRlZDtcbiAgICBjb25zdCBleGlmVHJhbnNmb3JtID0gYXdhaXQgZ2V0VHJhbnNmb3JtYXRpb25zRnJvbUV4aWZEYXRhKGF1dG9Sb3RhdGUgPyAtMSA6IHJlcy5vcmlnaW5hbEJhc2U2NCk7XG4gICAgaWYgKCFyZXMub3JpZ2luYWxJbWFnZSB8fCAhcmVzLm9yaWdpbmFsSW1hZ2UuY29tcGxldGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIGltYWdlIGxvYWRlZCcpKTtcbiAgICB9XG4gICAgY29uc3QgbG9hZGVkSW1hZ2UgPSB7XG4gICAgICBvcmlnaW5hbDoge1xuICAgICAgICBiYXNlNjQ6IHJlcy5vcmlnaW5hbEJhc2U2NCxcbiAgICAgICAgaW1hZ2U6IHJlcy5vcmlnaW5hbEltYWdlLFxuICAgICAgICBzaXplOiB7XG4gICAgICAgICAgd2lkdGg6IHJlcy5vcmlnaW5hbEltYWdlLm5hdHVyYWxXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHJlcy5vcmlnaW5hbEltYWdlLm5hdHVyYWxIZWlnaHRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGV4aWZUcmFuc2Zvcm1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUxvYWRlZEltYWdlKGxvYWRlZEltYWdlLCBjcm9wcGVyU2V0dGluZ3MpO1xuICB9XG5cbiAgYXN5bmMgdHJhbnNmb3JtTG9hZGVkSW1hZ2UobG9hZGVkSW1hZ2U6IFBhcnRpYWw8TG9hZGVkSW1hZ2U+LCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IGNyb3BwZXJTZXR0aW5ncy5jYW52YXNSb3RhdGlvbiArIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLnJvdGF0ZTtcbiAgICBjb25zdCBvcmlnaW5hbFNpemUgPSB7XG4gICAgICB3aWR0aDogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLm5hdHVyYWxXaWR0aCxcbiAgICAgIGhlaWdodDogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLm5hdHVyYWxIZWlnaHRcbiAgICB9O1xuICAgIGlmIChjYW52YXNSb3RhdGlvbiA9PT0gMCAmJiAhbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSEuZmxpcCAmJiAhY3JvcHBlclNldHRpbmdzLmNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICBiYXNlNjQ6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5iYXNlNjQsXG4gICAgICAgICAgaW1hZ2U6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5pbWFnZSxcbiAgICAgICAgICBzaXplOiB7Li4ub3JpZ2luYWxTaXplfVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm1lZDoge1xuICAgICAgICAgIGJhc2U2NDogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmJhc2U2NCxcbiAgICAgICAgICBpbWFnZTogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxuICAgICAgICAgIHNpemU6IHsuLi5vcmlnaW5hbFNpemV9XG4gICAgICAgIH0sXG4gICAgICAgIGV4aWZUcmFuc2Zvcm06IGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkU2l6ZSA9IHRoaXMuZ2V0VHJhbnNmb3JtZWRTaXplKG9yaWdpbmFsU2l6ZSwgbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSEsIGNyb3BwZXJTZXR0aW5ncyk7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdHJhbnNmb3JtZWRTaXplLndpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSB0cmFuc2Zvcm1lZFNpemUuaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGN0eD8uc2V0VHJhbnNmb3JtKFxuICAgICAgbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSEuZmxpcCA/IC0xIDogMSxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMSxcbiAgICAgIGNhbnZhcy53aWR0aCAvIDIsXG4gICAgICBjYW52YXMuaGVpZ2h0IC8gMlxuICAgICk7XG4gICAgY3R4Py5yb3RhdGUoTWF0aC5QSSAqIChjYW52YXNSb3RhdGlvbiAvIDIpKTtcbiAgICBjdHg/LmRyYXdJbWFnZShcbiAgICAgIGxvYWRlZEltYWdlLm9yaWdpbmFsIS5pbWFnZSxcbiAgICAgIC1vcmlnaW5hbFNpemUud2lkdGggLyAyLFxuICAgICAgLW9yaWdpbmFsU2l6ZS5oZWlnaHQgLyAyXG4gICAgKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZEJhc2U2NCA9IGNhbnZhcy50b0RhdGFVUkwoKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZEltYWdlID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VGcm9tQmFzZTY0KHRyYW5zZm9ybWVkQmFzZTY0KTtcbiAgICByZXR1cm4ge1xuICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgYmFzZTY0OiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuYmFzZTY0LFxuICAgICAgICBpbWFnZTogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxuICAgICAgICBzaXplOiB7Li4ub3JpZ2luYWxTaXplfVxuICAgICAgfSxcbiAgICAgIHRyYW5zZm9ybWVkOiB7XG4gICAgICAgIGJhc2U2NDogdHJhbnNmb3JtZWRCYXNlNjQsXG4gICAgICAgIGltYWdlOiB0cmFuc2Zvcm1lZEltYWdlLFxuICAgICAgICBzaXplOiB7XG4gICAgICAgICAgd2lkdGg6IHRyYW5zZm9ybWVkSW1hZ2Uud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB0cmFuc2Zvcm1lZEltYWdlLmhlaWdodFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXhpZlRyYW5zZm9ybTogbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSFcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkSW1hZ2VGcm9tQmFzZTY0KGltYWdlQmFzZTY0OiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4oKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltYWdlKTtcbiAgICAgIGltYWdlLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICBpbWFnZS5zcmMgPSBpbWFnZUJhc2U2NDtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRyYW5zZm9ybWVkU2l6ZShcbiAgICBvcmlnaW5hbFNpemU6IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICBleGlmVHJhbnNmb3JtOiBFeGlmVHJhbnNmb3JtLFxuICAgIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzXG4gICk6IERpbWVuc2lvbnMge1xuICAgIGNvbnN0IGNhbnZhc1JvdGF0aW9uID0gY3JvcHBlclNldHRpbmdzLmNhbnZhc1JvdGF0aW9uICsgZXhpZlRyYW5zZm9ybS5yb3RhdGU7XG4gICAgaWYgKGNyb3BwZXJTZXR0aW5ncy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGlmIChjYW52YXNSb3RhdGlvbiAlIDIpIHtcbiAgICAgICAgY29uc3QgbWluV2lkdGhUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUud2lkdGggKiBjcm9wcGVyU2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIGNvbnN0IG1pbkhlaWdodFRvQ29udGFpbiA9IG9yaWdpbmFsU2l6ZS5oZWlnaHQgLyBjcm9wcGVyU2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2lkdGg6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS5oZWlnaHQsIG1pbldpZHRoVG9Db250YWluKSxcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS53aWR0aCwgbWluSGVpZ2h0VG9Db250YWluKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbWluV2lkdGhUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUuaGVpZ2h0ICogY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHRUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUud2lkdGggLyBjcm9wcGVyU2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2lkdGg6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS53aWR0aCwgbWluV2lkdGhUb0NvbnRhaW4pLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5tYXgob3JpZ2luYWxTaXplLmhlaWdodCwgbWluSGVpZ2h0VG9Db250YWluKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjYW52YXNSb3RhdGlvbiAlIDIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogb3JpZ2luYWxTaXplLndpZHRoLFxuICAgICAgICB3aWR0aDogb3JpZ2luYWxTaXplLmhlaWdodFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiBvcmlnaW5hbFNpemUud2lkdGgsXG4gICAgICBoZWlnaHQ6IG9yaWdpbmFsU2l6ZS5oZWlnaHRcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function base64ToFile(base64Image) {
|
|
2
|
+
const split = base64Image.split(',');
|
|
3
|
+
const type = split[0].replace('data:', '').replace(';base64', '');
|
|
4
|
+
const byteString = atob(split[1]);
|
|
5
|
+
const ab = new ArrayBuffer(byteString.length);
|
|
6
|
+
const ia = new Uint8Array(ab);
|
|
7
|
+
for (let i = 0; i < byteString.length; i += 1) {
|
|
8
|
+
ia[i] = byteString.charCodeAt(i);
|
|
9
|
+
}
|
|
10
|
+
return new Blob([ab], { type });
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYi51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9saWIvdXRpbHMvYmxvYi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQW1CO0lBQzlDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sRUFBRSxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDN0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEM7SUFDRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gYmFzZTY0VG9GaWxlKGJhc2U2NEltYWdlOiBzdHJpbmcpOiBCbG9iIHtcbiAgY29uc3Qgc3BsaXQgPSBiYXNlNjRJbWFnZS5zcGxpdCgnLCcpO1xuICBjb25zdCB0eXBlID0gc3BsaXRbMF0ucmVwbGFjZSgnZGF0YTonLCAnJykucmVwbGFjZSgnO2Jhc2U2NCcsICcnKTtcbiAgY29uc3QgYnl0ZVN0cmluZyA9IGF0b2Ioc3BsaXRbMV0pO1xuICBjb25zdCBhYiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG4gIGNvbnN0IGlhID0gbmV3IFVpbnQ4QXJyYXkoYWIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpYVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gbmV3IEJsb2IoW2FiXSwge3R5cGV9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Black 2x1 JPEG, with the following meta information set:
|
|
2
|
+
// - EXIF Orientation: 6 (Rotated 90° CCW)
|
|
3
|
+
// Source: https://github.com/blueimp/JavaScript-Load-Image
|
|
4
|
+
const testAutoOrientationImageURL = 'data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA' +
|
|
5
|
+
'AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA' +
|
|
6
|
+
'QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE' +
|
|
7
|
+
'BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/x' +
|
|
8
|
+
'ABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAA' +
|
|
9
|
+
'AAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==';
|
|
10
|
+
export function supportsAutomaticRotation() {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
const img = new Image();
|
|
13
|
+
img.onload = () => {
|
|
14
|
+
// Check if browser supports automatic image orientation:
|
|
15
|
+
const supported = img.width === 1 && img.height === 2;
|
|
16
|
+
resolve(supported);
|
|
17
|
+
};
|
|
18
|
+
img.src = testAutoOrientationImageURL;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function getTransformationsFromExifData(exifRotationOrBase64Image) {
|
|
22
|
+
if (typeof exifRotationOrBase64Image === 'string') {
|
|
23
|
+
exifRotationOrBase64Image = getExifRotation(exifRotationOrBase64Image);
|
|
24
|
+
}
|
|
25
|
+
switch (exifRotationOrBase64Image) {
|
|
26
|
+
case 2:
|
|
27
|
+
return { rotate: 0, flip: true };
|
|
28
|
+
case 3:
|
|
29
|
+
return { rotate: 2, flip: false };
|
|
30
|
+
case 4:
|
|
31
|
+
return { rotate: 2, flip: true };
|
|
32
|
+
case 5:
|
|
33
|
+
return { rotate: 1, flip: true };
|
|
34
|
+
case 6:
|
|
35
|
+
return { rotate: 1, flip: false };
|
|
36
|
+
case 7:
|
|
37
|
+
return { rotate: 3, flip: true };
|
|
38
|
+
case 8:
|
|
39
|
+
return { rotate: 3, flip: false };
|
|
40
|
+
default:
|
|
41
|
+
return { rotate: 0, flip: false };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function getExifRotation(imageBase64) {
|
|
45
|
+
const view = new DataView(base64ToArrayBuffer(imageBase64));
|
|
46
|
+
if (view.getUint16(0, false) !== 0xFFD8) {
|
|
47
|
+
return -2;
|
|
48
|
+
}
|
|
49
|
+
const length = view.byteLength;
|
|
50
|
+
let offset = 2;
|
|
51
|
+
while (offset < length) {
|
|
52
|
+
if (view.getUint16(offset + 2, false) <= 8)
|
|
53
|
+
return -1;
|
|
54
|
+
const marker = view.getUint16(offset, false);
|
|
55
|
+
offset += 2;
|
|
56
|
+
if (marker == 0xFFE1) {
|
|
57
|
+
if (view.getUint32(offset += 2, false) !== 0x45786966) {
|
|
58
|
+
return -1;
|
|
59
|
+
}
|
|
60
|
+
const little = view.getUint16(offset += 6, false) == 0x4949;
|
|
61
|
+
offset += view.getUint32(offset + 4, little);
|
|
62
|
+
const tags = view.getUint16(offset, little);
|
|
63
|
+
offset += 2;
|
|
64
|
+
for (let i = 0; i < tags; i++) {
|
|
65
|
+
if (view.getUint16(offset + (i * 12), little) == 0x0112) {
|
|
66
|
+
return view.getUint16(offset + (i * 12) + 8, little);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if ((marker & 0xFF00) !== 0xFF00) {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
offset += view.getUint16(offset, false);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return -1;
|
|
78
|
+
}
|
|
79
|
+
function base64ToArrayBuffer(imageBase64) {
|
|
80
|
+
imageBase64 = imageBase64.replace(/^data\:([^\;]+)\;base64,/gmi, '');
|
|
81
|
+
const binaryString = atob(imageBase64);
|
|
82
|
+
const len = binaryString.length;
|
|
83
|
+
const bytes = new Uint8Array(len);
|
|
84
|
+
for (let i = 0; i < len; i++) {
|
|
85
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
86
|
+
}
|
|
87
|
+
return bytes.buffer;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhpZi51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9saWIvdXRpbHMvZXhpZi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSwyREFBMkQ7QUFDM0QsMENBQTBDO0FBQzFDLDJEQUEyRDtBQUMzRCxNQUFNLDJCQUEyQixHQUMvQix3RUFBd0U7SUFDeEUsd0VBQXdFO0lBQ3hFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUsd0VBQXdFO0lBQ3hFLDJEQUEyRCxDQUFDO0FBRTlELE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7WUFDaEIseURBQXlEO1lBQ3pELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3RELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUM7UUFDRixHQUFHLENBQUMsR0FBRyxHQUFHLDJCQUEyQixDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyx5QkFBMEM7SUFDdkYsSUFBSSxPQUFPLHlCQUF5QixLQUFLLFFBQVEsRUFBRTtRQUNqRCx5QkFBeUIsR0FBRyxlQUFlLENBQUMseUJBQXlCLENBQUMsQ0FBQztLQUN4RTtJQUNELFFBQVEseUJBQXlCLEVBQUU7UUFDakMsS0FBSyxDQUFDO1lBQ0osT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ25DLEtBQUssQ0FBQztZQUNKLE9BQU8s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O0lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNaLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLFdBQW1CO0lBQzlDLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2QyxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkM7SUFDRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV4aWZUcmFuc2Zvcm0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4aWYtdHJhbnNmb3JtLmludGVyZmFjZSc7XG5cbi8vIEJsYWNrIDJ4MSBKUEVHLCB3aXRoIHRoZSBmb2xsb3dpbmcgbWV0YSBpbmZvcm1hdGlvbiBzZXQ6XG4vLyAtIEVYSUYgT3JpZW50YXRpb246IDYgKFJvdGF0ZWQgOTDCsCBDQ1cpXG4vLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTG9hZC1JbWFnZVxuY29uc3QgdGVzdEF1dG9PcmllbnRhdGlvbkltYWdlVVJMID1cbiAgJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRRQWlSWGhwWmdBQVRVMEFLZ0FBQUFnQUFRRVNBQU1BQUFBQkFBWUFBQUEnICtcbiAgJ0FBQUQvMndDRUFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkEnICtcbiAgJ1FFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUUnICtcbiAgJ0JBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQWYvQUFCRUlBQUVBQWdNQkVRQUNFUUVERVFIL3gnICtcbiAgJ0FCS0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBTEVBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBQUFBQUFBQUFBQUFBQUEnICtcbiAgJ0FBQUFBRVFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBLzlvQURBTUJBQUlSQXhFQVB3QS84SC8vMlE9PSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0F1dG9tYXRpY1JvdGF0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0cyBhdXRvbWF0aWMgaW1hZ2Ugb3JpZW50YXRpb246XG4gICAgICBjb25zdCBzdXBwb3J0ZWQgPSBpbWcud2lkdGggPT09IDEgJiYgaW1nLmhlaWdodCA9PT0gMjtcbiAgICAgIHJlc29sdmUoc3VwcG9ydGVkKTtcbiAgICB9O1xuICAgIGltZy5zcmMgPSB0ZXN0QXV0b09yaWVudGF0aW9uSW1hZ2VVUkw7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNmb3JtYXRpb25zRnJvbUV4aWZEYXRhKGV4aWZSb3RhdGlvbk9yQmFzZTY0SW1hZ2U6IG51bWJlciB8IHN0cmluZyk6IEV4aWZUcmFuc2Zvcm0ge1xuICBpZiAodHlwZW9mIGV4aWZSb3RhdGlvbk9yQmFzZTY0SW1hZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgZXhpZlJvdGF0aW9uT3JCYXNlNjRJbWFnZSA9IGdldEV4aWZSb3RhdGlvbihleGlmUm90YXRpb25PckJhc2U2NEltYWdlKTtcbiAgfVxuICBzd2l0Y2ggKGV4aWZSb3RhdGlvbk9yQmFzZTY0SW1hZ2UpIHtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geyByb3RhdGU6IDAsIGZsaXA6IHRydWUgfTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4geyByb3RhdGU6IDIsIGZsaXA6IGZhbHNlIH07XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIHsgcm90YXRlOiAyLCBmbGlwOiB0cnVlIH07XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIHsgcm90YXRlOiAxLCBmbGlwOiB0cnVlIH07XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIHsgcm90YXRlOiAxLCBmbGlwOiBmYWxzZSB9O1xuICAgIGNhc2UgNzpcbiAgICAgIHJldHVybiB7IHJvdGF0ZTogMywgZmxpcDogdHJ1ZSB9O1xuICAgIGNhc2UgODpcbiAgICAgIHJldHVybiB7IHJvdGF0ZTogMywgZmxpcDogZmFsc2UgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgcm90YXRlOiAwLCBmbGlwOiBmYWxzZSB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEV4aWZSb3RhdGlvbihpbWFnZUJhc2U2NDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhiYXNlNjRUb0FycmF5QnVmZmVyKGltYWdlQmFzZTY0KSk7XG4gIGlmICh2aWV3LmdldFVpbnQxNigwLCBmYWxzZSkgIT09IDB4RkZEOCkge1xuICAgIHJldHVybiAtMjtcbiAgfVxuICBjb25zdCBsZW5ndGggPSB2aWV3LmJ5dGVMZW5ndGg7XG4gIGxldCBvZmZzZXQgPSAyO1xuICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7XG4gICAgaWYgKHZpZXcuZ2V0VWludDE2KG9mZnNldCArIDIsIGZhbHNlKSA8PSA4KSByZXR1cm4gLTE7XG4gICAgY29uc3QgbWFya2VyID0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG4gICAgb2Zmc2V0ICs9IDI7XG4gICAgaWYgKG1hcmtlciA9PSAweEZGRTEpIHtcbiAgICAgIGlmICh2aWV3LmdldFVpbnQzMihvZmZzZXQgKz0gMiwgZmFsc2UpICE9PSAweDQ1Nzg2OTY2KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGl0dGxlID0gdmlldy5nZXRVaW50MTYob2Zmc2V0ICs9IDYsIGZhbHNlKSA9PSAweDQ5NDk7XG4gICAgICBvZmZzZXQgKz0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgbGl0dGxlKTtcbiAgICAgIGNvbnN0IHRhZ3MgPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGxpdHRsZSk7XG4gICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnczsgaSsrKSB7XG4gICAgICAgIGlmICh2aWV3LmdldFVpbnQxNihvZmZzZXQgKyAoaSAqIDEyKSwgbGl0dGxlKSA9PSAweDAxMTIpIHtcbiAgICAgICAgICByZXR1cm4gdmlldy5nZXRVaW50MTYob2Zmc2V0ICsgKGkgKiAxMikgKyA4LCBsaXR0bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgobWFya2VyICYgMHhGRjAwKSAhPT0gMHhGRjAwKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ICs9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQXJyYXlCdWZmZXIoaW1hZ2VCYXNlNjQ6IHN0cmluZykge1xuICBpbWFnZUJhc2U2NCA9IGltYWdlQmFzZTY0LnJlcGxhY2UoL15kYXRhXFw6KFteXFw7XSspXFw7YmFzZTY0LC9nbWksICcnKTtcbiAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihpbWFnZUJhc2U2NCk7XG4gIGNvbnN0IGxlbiA9IGJpbmFyeVN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzLmJ1ZmZlcjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWVyLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi91dGlscy9oYW1tZXIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEhhbW1lclN0YXRpYyA9IG5ldyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQsIG9wdGlvbnM/OiBhbnkpID0+IEhhbW1lck1hbmFnZXI7XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbW1lck1hbmFnZXIge1xuICBnZXQoZXZlbnROYW1lOiBzdHJpbmcpOiBIYW1tZXJNYW5hZ2VyO1xuXG4gIHNldChvcHRpb25zOiBhbnkpOiBIYW1tZXJNYW5hZ2VyO1xuXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiAoZXY6IGFueSkgPT4gYW55KTogdm9pZDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function getPositionForKey(key) {
|
|
2
|
+
switch (key) {
|
|
3
|
+
case 'ArrowUp':
|
|
4
|
+
return 'top';
|
|
5
|
+
case 'ArrowRight':
|
|
6
|
+
return 'right';
|
|
7
|
+
case 'ArrowDown':
|
|
8
|
+
return 'bottom';
|
|
9
|
+
case 'ArrowLeft':
|
|
10
|
+
default:
|
|
11
|
+
return 'left';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function getInvertedPositionForKey(key) {
|
|
15
|
+
switch (key) {
|
|
16
|
+
case 'ArrowUp':
|
|
17
|
+
return 'bottom';
|
|
18
|
+
case 'ArrowRight':
|
|
19
|
+
return 'left';
|
|
20
|
+
case 'ArrowDown':
|
|
21
|
+
return 'top';
|
|
22
|
+
case 'ArrowLeft':
|
|
23
|
+
default:
|
|
24
|
+
return 'right';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function getEventForKey(key, stepSize) {
|
|
28
|
+
switch (key) {
|
|
29
|
+
case 'ArrowUp':
|
|
30
|
+
return { clientX: 0, clientY: stepSize * -1 };
|
|
31
|
+
case 'ArrowRight':
|
|
32
|
+
return { clientX: stepSize, clientY: 0 };
|
|
33
|
+
case 'ArrowDown':
|
|
34
|
+
return { clientX: 0, clientY: stepSize };
|
|
35
|
+
case 'ArrowLeft':
|
|
36
|
+
default:
|
|
37
|
+
return { clientX: stepSize * -1, clientY: 0 };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL3V0aWxzL2tleWJvYXJkLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFXO0lBQzNDLFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLFlBQVk7WUFDZixPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLFdBQVc7WUFDZCxPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLFdBQVcsQ0FBQztRQUNqQjtZQUNFLE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxHQUFXO0lBQ25ELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxRQUFRLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxNQUFNLENBQUM7UUFDaEIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLFdBQVcsQ0FBQztRQUNqQjtZQUNFLE9BQU8sT0FBTyxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBVyxFQUFFLFFBQWdCO0lBQzFELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQzlDLEtBQUssWUFBWTtZQUNmLE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUN6QyxLQUFLLFdBQVc7WUFDZCxPQUFPLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUM7UUFDekMsS0FBSyxXQUFXLENBQUM7UUFDakI7WUFDRSxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUM7S0FDL0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGdldFBvc2l0aW9uRm9yS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiAndG9wJztcbiAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdsZWZ0JztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW52ZXJ0ZWRQb3NpdGlvbkZvcktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICByZXR1cm4gJ3RvcCc7XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdyaWdodCc7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50Rm9yS2V5KGtleTogc3RyaW5nLCBzdGVwU2l6ZTogbnVtYmVyKTogYW55IHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiB7Y2xpZW50WDogMCwgY2xpZW50WTogc3RlcFNpemUgKiAtMX07XG4gICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICByZXR1cm4ge2NsaWVudFg6IHN0ZXBTaXplLCBjbGllbnRZOiAwfTtcbiAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgcmV0dXJuIHtjbGllbnRYOiAwLCBjbGllbnRZOiBzdGVwU2l6ZX07XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtjbGllbnRYOiBzdGVwU2l6ZSAqIC0xLCBjbGllbnRZOiAwfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Hermite resize - fast image resize/resample using Hermite filter.
|
|
3
|
+
* https://github.com/viliusle/Hermite-resize
|
|
4
|
+
*/
|
|
5
|
+
export function resizeCanvas(canvas, width, height) {
|
|
6
|
+
const width_source = canvas.width;
|
|
7
|
+
const height_source = canvas.height;
|
|
8
|
+
width = Math.round(width);
|
|
9
|
+
height = Math.round(height);
|
|
10
|
+
const ratio_w = width_source / width;
|
|
11
|
+
const ratio_h = height_source / height;
|
|
12
|
+
const ratio_w_half = Math.ceil(ratio_w / 2);
|
|
13
|
+
const ratio_h_half = Math.ceil(ratio_h / 2);
|
|
14
|
+
const ctx = canvas.getContext('2d');
|
|
15
|
+
if (ctx) {
|
|
16
|
+
const img = ctx.getImageData(0, 0, width_source, height_source);
|
|
17
|
+
const img2 = ctx.createImageData(width, height);
|
|
18
|
+
const data = img.data;
|
|
19
|
+
const data2 = img2.data;
|
|
20
|
+
for (let j = 0; j < height; j++) {
|
|
21
|
+
for (let i = 0; i < width; i++) {
|
|
22
|
+
const x2 = (i + j * width) * 4;
|
|
23
|
+
const center_y = j * ratio_h;
|
|
24
|
+
let weight = 0;
|
|
25
|
+
let weights = 0;
|
|
26
|
+
let weights_alpha = 0;
|
|
27
|
+
let gx_r = 0;
|
|
28
|
+
let gx_g = 0;
|
|
29
|
+
let gx_b = 0;
|
|
30
|
+
let gx_a = 0;
|
|
31
|
+
const xx_start = Math.floor(i * ratio_w);
|
|
32
|
+
const yy_start = Math.floor(j * ratio_h);
|
|
33
|
+
let xx_stop = Math.ceil((i + 1) * ratio_w);
|
|
34
|
+
let yy_stop = Math.ceil((j + 1) * ratio_h);
|
|
35
|
+
xx_stop = Math.min(xx_stop, width_source);
|
|
36
|
+
yy_stop = Math.min(yy_stop, height_source);
|
|
37
|
+
for (let yy = yy_start; yy < yy_stop; yy++) {
|
|
38
|
+
const dy = Math.abs(center_y - yy) / ratio_h_half;
|
|
39
|
+
const center_x = i * ratio_w;
|
|
40
|
+
const w0 = dy * dy; //pre-calc part of w
|
|
41
|
+
for (let xx = xx_start; xx < xx_stop; xx++) {
|
|
42
|
+
const dx = Math.abs(center_x - xx) / ratio_w_half;
|
|
43
|
+
const w = Math.sqrt(w0 + dx * dx);
|
|
44
|
+
if (w >= 1) {
|
|
45
|
+
//pixel too far
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
//hermite filter
|
|
49
|
+
weight = 2 * w * w * w - 3 * w * w + 1;
|
|
50
|
+
const pos_x = 4 * (xx + yy * width_source);
|
|
51
|
+
//alpha
|
|
52
|
+
gx_a += weight * data[pos_x + 3];
|
|
53
|
+
weights_alpha += weight;
|
|
54
|
+
//colors
|
|
55
|
+
if (data[pos_x + 3] < 255)
|
|
56
|
+
weight = weight * data[pos_x + 3] / 250;
|
|
57
|
+
gx_r += weight * data[pos_x];
|
|
58
|
+
gx_g += weight * data[pos_x + 1];
|
|
59
|
+
gx_b += weight * data[pos_x + 2];
|
|
60
|
+
weights += weight;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
data2[x2] = gx_r / weights;
|
|
64
|
+
data2[x2 + 1] = gx_g / weights;
|
|
65
|
+
data2[x2 + 2] = gx_b / weights;
|
|
66
|
+
data2[x2 + 3] = gx_a / weights_alpha;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
canvas.width = width;
|
|
70
|
+
canvas.height = height;
|
|
71
|
+
//draw
|
|
72
|
+
ctx.putImageData(img2, 0, 0);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi91dGlscy9yZXNpemUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUF5QixFQUFFLEtBQWEsRUFBRSxNQUFjO0lBQ25GLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDbEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNwQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QixNQUFNLE9BQU8sR0FBRyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFDdkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFNUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLEdBQUcsRUFBRTtRQUNQLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN0QixN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QyxDQUFDLEdBQUcsR0FBRzs0QkFDdkIsTUFBTSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFDMUMsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzdCLElBQUksSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDakMsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNqQyxPQUFPLElBQUksTUFBTSxDQUFDO3FCQUNuQjtpQkFDRjtnQkFDRCxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQztnQkFDM0IsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDO2dCQUMvQixLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQy9CLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLGFBQWEsQ0FBQzthQUN0QztTQUNGO1FBR0QsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFdkIsTUFBTTtRQUNOLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUM5QjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogSGVybWl0ZSByZXNpemUgLSBmYXN0IGltYWdlIHJlc2l6ZS9yZXNhbXBsZSB1c2luZyBIZXJtaXRlIGZpbHRlci5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS92aWxpdXNsZS9IZXJtaXRlLXJlc2l6ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVDYW52YXMoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgY29uc3Qgd2lkdGhfc291cmNlID0gY2FudmFzLndpZHRoO1xuICBjb25zdCBoZWlnaHRfc291cmNlID0gY2FudmFzLmhlaWdodDtcbiAgd2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoKTtcbiAgaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuXG4gIGNvbnN0IHJhdGlvX3cgPSB3aWR0aF9zb3VyY2UgLyB3aWR0aDtcbiAgY29uc3QgcmF0aW9faCA9IGhlaWdodF9zb3VyY2UgLyBoZWlnaHQ7XG4gIGNvbnN0IHJhdGlvX3dfaGFsZiA9IE1hdGguY2VpbChyYXRpb193IC8gMik7XG4gIGNvbnN0IHJhdGlvX2hfaGFsZiA9IE1hdGguY2VpbChyYXRpb19oIC8gMik7XG5cbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGlmIChjdHgpIHtcbiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoX3NvdXJjZSwgaGVpZ2h0X3NvdXJjZSk7XG4gICAgY29uc3QgaW1nMiA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgZGF0YSA9IGltZy5kYXRhO1xuICAgIGNvbnN0IGRhdGEyID0gaW1nMi5kYXRhO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHgyID0gKGkgKyBqICogd2lkdGgpICogNDtcbiAgICAgICAgY29uc3QgY2VudGVyX3kgPSBqICogcmF0aW9faDtcbiAgICAgICAgbGV0IHdlaWdodCA9IDA7XG4gICAgICAgIGxldCB3ZWlnaHRzID0gMDtcbiAgICAgICAgbGV0IHdlaWdodHNfYWxwaGEgPSAwO1xuICAgICAgICBsZXQgZ3hfciA9IDA7XG4gICAgICAgIGxldCBneF9nID0gMDtcbiAgICAgICAgbGV0IGd4X2IgPSAwO1xuICAgICAgICBsZXQgZ3hfYSA9IDA7XG5cbiAgICAgICAgY29uc3QgeHhfc3RhcnQgPSBNYXRoLmZsb29yKGkgKiByYXRpb193KTtcbiAgICAgICAgY29uc3QgeXlfc3RhcnQgPSBNYXRoLmZsb29yKGogKiByYXRpb19oKTtcbiAgICAgICAgbGV0IHh4X3N0b3AgPSBNYXRoLmNlaWwoKGkgKyAxKSAqIHJhdGlvX3cpO1xuICAgICAgICBsZXQgeXlfc3RvcCA9IE1hdGguY2VpbCgoaiArIDEpICogcmF0aW9faCk7XG4gICAgICAgIHh4X3N0b3AgPSBNYXRoLm1pbih4eF9zdG9wLCB3aWR0aF9zb3VyY2UpO1xuICAgICAgICB5eV9zdG9wID0gTWF0aC5taW4oeXlfc3RvcCwgaGVpZ2h0X3NvdXJjZSk7XG5cbiAgICAgICAgZm9yIChsZXQgeXkgPSB5eV9zdGFydDsgeXkgPCB5eV9zdG9wOyB5eSsrKSB7XG4gICAgICAgICAgY29uc3QgZHkgPSBNYXRoLmFicyhjZW50ZXJfeSAtIHl5KSAvIHJhdGlvX2hfaGFsZjtcbiAgICAgICAgICBjb25zdCBjZW50ZXJfeCA9IGkgKiByYXRpb193O1xuICAgICAgICAgIGNvbnN0IHcwID0gZHkgKiBkeTsgLy9wcmUtY2FsYyBwYXJ0IG9mIHdcbiAgICAgICAgICBmb3IgKGxldCB4eCA9IHh4X3N0YXJ0OyB4eCA8IHh4X3N0b3A7IHh4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gTWF0aC5hYnMoY2VudGVyX3ggLSB4eCkgLyByYXRpb193X2hhbGY7XG4gICAgICAgICAgICBjb25zdCB3ID0gTWF0aC5zcXJ0KHcwICsgZHggKiBkeCk7XG4gICAgICAgICAgICBpZiAodyA+PSAxKSB7XG4gICAgICAgICAgICAgIC8vcGl4ZWwgdG9vIGZhclxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vaGVybWl0ZSBmaWx0ZXJcbiAgICAgICAgICAgIHdlaWdodCA9IDIgKiB3ICogdyAqIHcgLSAzICogdyAqIHcgKyAxO1xuICAgICAgICAgICAgY29uc3QgcG9zX3ggPSA0ICogKHh4ICsgeXkgKiB3aWR0aF9zb3VyY2UpO1xuICAgICAgICAgICAgLy9hbHBoYVxuICAgICAgICAgICAgZ3hfYSArPSB3ZWlnaHQgKiBkYXRhW3Bvc194ICsgM107XG4gICAgICAgICAgICB3ZWlnaHRzX2FscGhhICs9IHdlaWdodDtcbiAgICAgICAgICAgIC8vY29sb3JzXG4gICAgICAgICAgICBpZiAoZGF0YVtwb3NfeCArIDNdIDwgMjU1KVxuICAgICAgICAgICAgICB3ZWlnaHQgPSB3ZWlnaHQgKiBkYXRhW3Bvc194ICsgM10gLyAyNTA7XG4gICAgICAgICAgICBneF9yICs9IHdlaWdodCAqIGRhdGFbcG9zX3hdO1xuICAgICAgICAgICAgZ3hfZyArPSB3ZWlnaHQgKiBkYXRhW3Bvc194ICsgMV07XG4gICAgICAgICAgICBneF9iICs9IHdlaWdodCAqIGRhdGFbcG9zX3ggKyAyXTtcbiAgICAgICAgICAgIHdlaWdodHMgKz0gd2VpZ2h0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkYXRhMlt4Ml0gPSBneF9yIC8gd2VpZ2h0cztcbiAgICAgICAgZGF0YTJbeDIgKyAxXSA9IGd4X2cgLyB3ZWlnaHRzO1xuICAgICAgICBkYXRhMlt4MiArIDJdID0gZ3hfYiAvIHdlaWdodHM7XG4gICAgICAgIGRhdGEyW3gyICsgM10gPSBneF9hIC8gd2VpZ2h0c19hbHBoYTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAvL2RyYXdcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltZzIsIDAsIDApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWltYWdlLWNyb3BwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbmd4LWltYWdlLWNyb3BwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './lib/component/image-cropper.component';
|
|
2
|
+
export * from './lib/image-cropper.module';
|
|
3
|
+
export * from './lib/interfaces';
|
|
4
|
+
export { base64ToFile } from './lib/utils/blob.utils';
|
|
5
|
+
export { resizeCanvas } from './lib/utils/resize.utils';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnQvaW1hZ2UtY3JvcHBlci5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW1hZ2UtY3JvcHBlci5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcyc7XG5leHBvcnQgeyBiYXNlNjRUb0ZpbGUgfSBmcm9tICcuL2xpYi91dGlscy9ibG9iLnV0aWxzJztcbmV4cG9ydCB7IHJlc2l6ZUNhbnZhcyB9IGZyb20gJy4vbGliL3V0aWxzL3Jlc2l6ZS51dGlscyc7XG4iXX0=
|