ngx-image-cropper 7.1.2 → 7.2.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/esm2020/lib/component/image-cropper.component.mjs +2 -2
- package/esm2020/lib/services/load-image.service.mjs +63 -34
- package/fesm2015/ngx-image-cropper.mjs +69 -31
- package/fesm2015/ngx-image-cropper.mjs.map +1 -1
- package/fesm2020/ngx-image-cropper.mjs +62 -33
- package/fesm2020/ngx-image-cropper.mjs.map +1 -1
- package/lib/services/load-image.service.d.ts +2 -1
- package/package.json +1 -1
|
@@ -618,29 +618,33 @@ class LoadImageService {
|
|
|
618
618
|
this.autoRotateSupported = supportsAutomaticRotation();
|
|
619
619
|
}
|
|
620
620
|
loadImageFile(file, cropperSettings) {
|
|
621
|
-
return
|
|
622
|
-
|
|
621
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
622
|
+
const arrayBuffer = yield file.arrayBuffer();
|
|
623
|
+
return yield this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings);
|
|
624
|
+
});
|
|
623
625
|
}
|
|
624
626
|
checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, imageType, cropperSettings) {
|
|
625
627
|
if (!this.isValidImageType(imageType)) {
|
|
626
628
|
return Promise.reject(new Error('Invalid image type'));
|
|
627
629
|
}
|
|
628
|
-
return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);
|
|
630
|
+
return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType);
|
|
629
631
|
}
|
|
630
632
|
isValidImageType(type) {
|
|
631
|
-
return /image\/(png|jpg|jpeg|bmp|gif|tiff|webp|x-icon|vnd.microsoft.icon)/.test(type);
|
|
633
|
+
return /image\/(png|jpg|jpeg|bmp|gif|tiff|svg|webp|x-icon|vnd.microsoft.icon)/.test(type);
|
|
632
634
|
}
|
|
633
635
|
loadImageFromURL(url, cropperSettings) {
|
|
634
|
-
return
|
|
635
|
-
|
|
636
|
-
|
|
636
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
637
|
+
const res = yield fetch(url);
|
|
638
|
+
const buffer = yield res.arrayBuffer();
|
|
639
|
+
return yield this.loadImageFromArrayBuffer(buffer, cropperSettings);
|
|
640
|
+
});
|
|
637
641
|
}
|
|
638
642
|
loadBase64Image(imageBase64, cropperSettings) {
|
|
639
643
|
const arrayBuffer = this.base64ToArrayBuffer(imageBase64);
|
|
640
644
|
return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);
|
|
641
645
|
}
|
|
642
646
|
base64ToArrayBuffer(imageBase64) {
|
|
643
|
-
imageBase64 = imageBase64.replace(/^data
|
|
647
|
+
imageBase64 = imageBase64.replace(/^data:([^;]+);base64,/gmi, '');
|
|
644
648
|
const binaryString = atob(imageBase64);
|
|
645
649
|
const len = binaryString.length;
|
|
646
650
|
const bytes = new Uint8Array(len);
|
|
@@ -649,24 +653,61 @@ class LoadImageService {
|
|
|
649
653
|
}
|
|
650
654
|
return bytes.buffer;
|
|
651
655
|
}
|
|
652
|
-
loadImageFromArrayBuffer(arrayBuffer, cropperSettings) {
|
|
653
|
-
return
|
|
654
|
-
const
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
656
|
+
loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType) {
|
|
657
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
658
|
+
const res = yield new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
659
|
+
try {
|
|
660
|
+
const blob = new Blob([arrayBuffer], imageType ? { type: imageType } : undefined);
|
|
661
|
+
const objectUrl = URL.createObjectURL(blob);
|
|
662
|
+
const originalImage = new Image();
|
|
663
|
+
const isSvg = imageType === 'image/svg+xml';
|
|
664
|
+
const originalImageSize = isSvg ? yield this.getSvgImageSize(blob) : undefined;
|
|
665
|
+
originalImage.onload = () => resolve({
|
|
666
|
+
originalImage,
|
|
667
|
+
originalImageSize,
|
|
668
|
+
originalObjectUrl: objectUrl,
|
|
669
|
+
originalArrayBuffer: arrayBuffer
|
|
670
|
+
});
|
|
671
|
+
originalImage.onerror = reject;
|
|
672
|
+
originalImage.src = objectUrl;
|
|
673
|
+
}
|
|
674
|
+
catch (e) {
|
|
675
|
+
reject(e);
|
|
676
|
+
}
|
|
677
|
+
}));
|
|
678
|
+
return yield this.transformImageFromArrayBuffer(res, cropperSettings, res.originalImageSize != null);
|
|
679
|
+
});
|
|
665
680
|
}
|
|
666
|
-
|
|
681
|
+
getSvgImageSize(blob) {
|
|
682
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
683
|
+
const parser = new DOMParser();
|
|
684
|
+
const doc = parser.parseFromString(yield blob.text(), 'image/svg+xml');
|
|
685
|
+
const svgElement = doc.querySelector('svg');
|
|
686
|
+
if (!svgElement) {
|
|
687
|
+
throw Error('Failed to parse SVG image');
|
|
688
|
+
}
|
|
689
|
+
const widthAttr = svgElement.getAttribute('width');
|
|
690
|
+
const heightAttr = svgElement.getAttribute('height');
|
|
691
|
+
if (widthAttr && heightAttr) {
|
|
692
|
+
return null;
|
|
693
|
+
}
|
|
694
|
+
const viewBoxAttr = svgElement.getAttribute('viewBox')
|
|
695
|
+
|| svgElement.getAttribute('viewbox');
|
|
696
|
+
if (viewBoxAttr) {
|
|
697
|
+
const viewBox = viewBoxAttr.split(' ');
|
|
698
|
+
return {
|
|
699
|
+
width: +viewBox[2],
|
|
700
|
+
height: +viewBox[3]
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
throw Error('Failed to load SVG image. SVG must have width + height or viewBox definition.');
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
transformImageFromArrayBuffer(res, cropperSettings, forceTransform = false) {
|
|
707
|
+
var _a;
|
|
667
708
|
return __awaiter(this, void 0, void 0, function* () {
|
|
668
709
|
const autoRotate = yield this.autoRotateSupported;
|
|
669
|
-
const exifTransform =
|
|
710
|
+
const exifTransform = getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);
|
|
670
711
|
if (!res.originalImage || !res.originalImage.complete) {
|
|
671
712
|
return Promise.reject(new Error('No image loaded'));
|
|
672
713
|
}
|
|
@@ -674,24 +715,21 @@ class LoadImageService {
|
|
|
674
715
|
original: {
|
|
675
716
|
objectUrl: res.originalObjectUrl,
|
|
676
717
|
image: res.originalImage,
|
|
677
|
-
size: {
|
|
718
|
+
size: (_a = res.originalImageSize) !== null && _a !== void 0 ? _a : {
|
|
678
719
|
width: res.originalImage.naturalWidth,
|
|
679
720
|
height: res.originalImage.naturalHeight
|
|
680
721
|
}
|
|
681
722
|
},
|
|
682
723
|
exifTransform
|
|
683
724
|
};
|
|
684
|
-
return this.transformLoadedImage(loadedImage, cropperSettings);
|
|
725
|
+
return this.transformLoadedImage(loadedImage, cropperSettings, forceTransform);
|
|
685
726
|
});
|
|
686
727
|
}
|
|
687
|
-
transformLoadedImage(loadedImage, cropperSettings) {
|
|
728
|
+
transformLoadedImage(loadedImage, cropperSettings, forceTransform = false) {
|
|
688
729
|
return __awaiter(this, void 0, void 0, function* () {
|
|
689
730
|
const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform.rotate;
|
|
690
|
-
const originalSize =
|
|
691
|
-
|
|
692
|
-
height: loadedImage.original.image.naturalHeight
|
|
693
|
-
};
|
|
694
|
-
if (canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperSettings.containWithinAspectRatio) {
|
|
731
|
+
const originalSize = loadedImage.original.size;
|
|
732
|
+
if (!forceTransform && canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperSettings.containWithinAspectRatio) {
|
|
695
733
|
return {
|
|
696
734
|
original: {
|
|
697
735
|
objectUrl: loadedImage.original.objectUrl,
|