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.
@@ -618,29 +618,33 @@ class LoadImageService {
618
618
  this.autoRotateSupported = supportsAutomaticRotation();
619
619
  }
620
620
  loadImageFile(file, cropperSettings) {
621
- return file.arrayBuffer()
622
- .then(arrayBuffer => this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings));
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 fetch(url)
635
- .then(res => res.arrayBuffer())
636
- .then(buffer => this.loadImageFromArrayBuffer(buffer, cropperSettings));
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\:([^\;]+)\;base64,/gmi, '');
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 new Promise((resolve, reject) => {
654
- const blob = new Blob([arrayBuffer]);
655
- const objectUrl = URL.createObjectURL(blob);
656
- const originalImage = new Image();
657
- originalImage.onload = () => resolve({
658
- originalImage,
659
- originalObjectUrl: objectUrl,
660
- originalArrayBuffer: arrayBuffer
661
- });
662
- originalImage.onerror = reject;
663
- originalImage.src = objectUrl;
664
- }).then((res) => this.transformImageFromArrayBuffer(res, cropperSettings));
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
- transformImageFromArrayBuffer(res, cropperSettings) {
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 = yield getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);
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
- width: loadedImage.original.image.naturalWidth,
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,