ngx-image-cropper 9.1.1 → 9.1.3
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/esm2022/lib/component/cropper.state.mjs +27 -17
- package/esm2022/lib/component/image-cropper.component.mjs +9 -9
- package/esm2022/lib/interfaces/crop-input.interface.mjs +2 -0
- package/esm2022/lib/interfaces/cropper-options.interface.mjs +1 -1
- package/esm2022/lib/interfaces/index.mjs +1 -1
- package/esm2022/lib/services/crop.service.mjs +51 -54
- package/esm2022/lib/utils/cropper-position.utils.mjs +29 -29
- package/fesm2022/ngx-image-cropper.mjs +112 -105
- package/fesm2022/ngx-image-cropper.mjs.map +1 -1
- package/lib/component/cropper.state.d.ts +3 -3
- package/lib/interfaces/crop-input.interface.d.ts +23 -0
- package/lib/interfaces/cropper-options.interface.d.ts +1 -1
- package/lib/interfaces/index.d.ts +1 -0
- package/lib/services/crop.service.d.ts +12 -6
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-image-cropper.mjs","sources":["../../../projects/ngx-image-cropper/src/lib/utils/cropper-position.utils.ts","../../../projects/ngx-image-cropper/src/lib/component/cropper.state.ts","../../../projects/ngx-image-cropper/src/lib/interfaces/move-start.interface.ts","../../../projects/ngx-image-cropper/src/lib/utils/resize.utils.ts","../../../projects/ngx-image-cropper/src/lib/utils/percentage.utils.ts","../../../projects/ngx-image-cropper/src/lib/services/crop.service.ts","../../../projects/ngx-image-cropper/src/lib/utils/exif.utils.ts","../../../projects/ngx-image-cropper/src/lib/services/load-image.service.ts","../../../projects/ngx-image-cropper/src/lib/utils/keyboard.utils.ts","../../../projects/ngx-image-cropper/src/lib/component/image-cropper.component.ts","../../../projects/ngx-image-cropper/src/lib/component/image-cropper.component.html","../../../projects/ngx-image-cropper/src/lib/utils/blob.utils.ts","../../../projects/ngx-image-cropper/src/ngx-image-cropper.ts"],"sourcesContent":["import { CropperPosition, MoveStart } from '../interfaces';\nimport { CropperState } from '../component/cropper.state';\nimport { BasicEvent } from '../interfaces/basic-event.interface';\n\nexport function checkCropperPosition(cropperPosition: CropperPosition, cropperState: CropperState, maintainSize: boolean): CropperPosition {\n cropperPosition = checkCropperSizeRestriction(cropperPosition, cropperState);\n return checkCropperWithinMaxSizeBounds(cropperPosition, cropperState, maintainSize);\n}\n\nexport function checkCropperSizeRestriction(cropperPosition: CropperPosition, cropperState: CropperState): CropperPosition {\n let cropperWidth = cropperPosition.x2 - cropperPosition.x1;\n let cropperHeight = cropperPosition.y2 - cropperPosition.y1;\n const centerX = cropperPosition.x1 + cropperWidth / 2;\n const centerY = cropperPosition.y1 + cropperHeight / 2;\n\n if (cropperState.options.cropperStaticHeight && cropperState.options.cropperStaticWidth) {\n cropperWidth = cropperState.maxSize!.width > cropperState.options.cropperStaticWidth\n ? cropperState.options.cropperStaticWidth\n : cropperState.maxSize!.width;\n cropperHeight = cropperState.maxSize!.height > cropperState.options.cropperStaticHeight\n ? cropperState.options.cropperStaticHeight\n : cropperState.maxSize!.height;\n } else {\n cropperWidth = Math.max(cropperState.cropperScaledMinWidth, Math.min(cropperWidth, cropperState.cropperScaledMaxWidth, cropperState.maxSize!.width));\n cropperHeight = Math.max(cropperState.cropperScaledMinHeight, Math.min(cropperHeight, cropperState.cropperScaledMaxHeight, cropperState.maxSize!.height));\n if (cropperState.options.maintainAspectRatio) {\n if (cropperState.maxSize!.width / cropperState.options.aspectRatio < cropperState.maxSize!.height) {\n cropperHeight = cropperWidth / cropperState.options.aspectRatio;\n } else {\n cropperWidth = cropperHeight * cropperState.options.aspectRatio;\n }\n }\n }\n\n const x1 = centerX - cropperWidth / 2;\n const x2 = x1 + cropperWidth;\n const y1 = centerY - cropperHeight / 2;\n const y2 = y1 + cropperHeight;\n return {x1, x2, y1, y2};\n}\n\nexport function checkCropperWithinMaxSizeBounds(position: CropperPosition, cropperState: CropperState, maintainSize = false): CropperPosition {\n if (position.x1 < 0) {\n position = {\n ...position,\n x1: 0,\n x2: position.x2 - (maintainSize ? position.x1 : 0)\n };\n }\n if (position.y1 < 0) {\n position = {\n ...position,\n y2: position.y2 - (maintainSize ? position.y1 : 0),\n y1: 0\n };\n }\n if (position.x2 > cropperState.maxSize!.width) {\n position = {\n ...position,\n x1: position.x1 - (maintainSize ? (position.x2 - cropperState.maxSize!.width) : 0),\n x2: cropperState.maxSize!.width\n };\n }\n if (position.y2 > cropperState.maxSize!.height) {\n position = {\n ...position,\n y1: position.y1 - (maintainSize ? (position.y2 - cropperState.maxSize!.height) : 0),\n y2: cropperState.maxSize!.height\n };\n }\n return position;\n}\n\nexport function moveCropper(event: Event | BasicEvent, moveStart: MoveStart): CropperPosition {\n const diffX = getClientX(event) - moveStart.clientX;\n const diffY = getClientY(event) - moveStart.clientY;\n\n return {\n x1: moveStart.cropper.x1 + diffX,\n y1: moveStart.cropper.y1 + diffY,\n x2: moveStart.cropper.x2 + diffX,\n y2: moveStart.cropper.y2 + diffY\n };\n}\n\nexport function resizeCropper(event: Event | BasicEvent, moveStart: MoveStart, cropperState: CropperState): CropperPosition {\n const cropperPosition = {...cropperState.cropper()};\n const moveX = getClientX(event) - moveStart.clientX;\n const moveY = getClientY(event) - moveStart.clientY;\n switch (moveStart.position) {\n case 'left':\n cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth),\n cropperPosition.x2 - cropperState.cropperScaledMinWidth);\n break;\n case 'topleft':\n cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth),\n cropperPosition.x2 - cropperState.cropperScaledMinWidth);\n cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight),\n cropperPosition.y2 - cropperState.cropperScaledMinHeight);\n break;\n case 'top':\n cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight),\n cropperPosition.y2 - cropperState.cropperScaledMinHeight);\n break;\n case 'topright':\n cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth),\n cropperPosition.x1 + cropperState.cropperScaledMinWidth);\n cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight),\n cropperPosition.y2 - cropperState.cropperScaledMinHeight);\n break;\n case 'right':\n cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth),\n cropperPosition.x1 + cropperState.cropperScaledMinWidth);\n break;\n case 'bottomright':\n cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth),\n cropperPosition.x1 + cropperState.cropperScaledMinWidth);\n cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight),\n cropperPosition.y1 + cropperState.cropperScaledMinHeight);\n break;\n case 'bottom':\n cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight),\n cropperPosition.y1 + cropperState.cropperScaledMinHeight);\n break;\n case 'bottomleft':\n cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth),\n cropperPosition.x2 - cropperState.cropperScaledMinWidth);\n cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight),\n cropperPosition.y1 + cropperState.cropperScaledMinHeight);\n break;\n case 'center':\n const scale = 'scale' in event ? event.scale as number : 1;\n const newWidth = Math.min(\n Math.max(cropperState.cropperScaledMinWidth, (Math.abs(moveStart.cropper.x2 - moveStart.cropper.x1)) * scale),\n cropperState.cropperScaledMaxWidth);\n const newHeight = Math.min(\n Math.max(cropperState.cropperScaledMinHeight, (Math.abs(moveStart.cropper.y2 - moveStart.cropper.y1)) * scale),\n cropperState.cropperScaledMaxHeight);\n cropperPosition.x1 = moveStart.clientX - newWidth / 2;\n cropperPosition.x2 = moveStart.clientX + newWidth / 2;\n cropperPosition.y1 = moveStart.clientY - newHeight / 2;\n cropperPosition.y2 = moveStart.clientY + newHeight / 2;\n if (cropperPosition.x1 < 0) {\n cropperPosition.x2 -= cropperPosition.x1;\n cropperPosition.x1 = 0;\n } else if (cropperPosition.x2 > cropperState.maxSize!.width) {\n cropperPosition.x1 -= (cropperPosition.x2 - cropperState.maxSize!.width);\n cropperPosition.x2 = cropperState.maxSize!.width;\n }\n if (cropperPosition.y1 < 0) {\n cropperPosition.y2 -= cropperPosition.y1;\n cropperPosition.y1 = 0;\n } else if (cropperPosition.y2 > cropperState.maxSize!.height) {\n cropperPosition.y1 -= (cropperPosition.y2 - cropperState.maxSize!.height);\n cropperPosition.y2 = cropperState.maxSize!.height;\n }\n break;\n }\n\n if (cropperState.options.maintainAspectRatio) {\n return checkAspectRatio(moveStart.position!, cropperPosition, cropperState);\n } else {\n return cropperPosition;\n }\n}\n\nexport function checkAspectRatio(position: string, cropperPosition: CropperPosition, cropperState: CropperState): CropperPosition {\n cropperPosition = {...cropperPosition};\n let overflowX = 0;\n let overflowY = 0;\n switch (position) {\n case 'top':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize!.width, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'bottom':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize!.width, 0);\n overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize!.height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : (overflowX / cropperState.options.aspectRatio);\n }\n break;\n case 'topleft':\n cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n overflowX = Math.max(0 - cropperPosition.x1, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'topright':\n cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize!.width, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'right':\n case 'bottomright':\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize!.width, 0);\n overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize!.height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'left':\n case 'bottomleft':\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n overflowX = Math.max(0 - cropperPosition.x1, 0);\n overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize!.height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'center':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n const overflowX1 = Math.max(0 - cropperPosition.x1, 0);\n const overflowX2 = Math.max(cropperPosition.x2 - cropperState.maxSize!.width, 0);\n const overflowY1 = Math.max(cropperPosition.y2 - cropperState.maxSize!.height, 0);\n const overflowY2 = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {\n cropperPosition.x1 += (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? (overflowY1 * cropperState.options.aspectRatio) : overflowX1;\n cropperPosition.x2 -= (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? (overflowY2 * cropperState.options.aspectRatio) : overflowX2;\n cropperPosition.y1 += (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / cropperState.options.aspectRatio;\n cropperPosition.y2 -= (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / cropperState.options.aspectRatio;\n }\n break;\n }\n return cropperPosition;\n}\n\nexport function getClientX(event: Event | BasicEvent | TouchEvent): number {\n if ('touches' in event && event.touches[0]) {\n return event.touches[0].clientX;\n } else if ('clientX' in event) {\n return event.clientX;\n }\n\n return 0;\n}\n\nexport function getClientY(event: Event | BasicEvent | TouchEvent): number {\n if ('touches' in event && event.touches[0]) {\n return event.touches[0].clientY;\n } else if ('clientX' in event) {\n return event.clientY;\n }\n\n return 0;\n}\n","import { CropperOptions } from '../interfaces/cropper-options.interface';\nimport { CropperPosition, Dimensions, ImageTransform, LoadedImage } from '../interfaces';\nimport { signal, SimpleChanges } from '@angular/core';\nimport { checkCropperPosition } from '../utils/cropper-position.utils';\n\nexport class CropperState {\n\n readonly cropper = signal<CropperPosition>({x1: 0, x2: 0, y1: 0, y2: 0});\n\n loadedImage?: LoadedImage;\n maxSize?: Dimensions;\n transform: ImageTransform = {};\n options: CropperOptions = {\n format: 'png',\n output: 'blob',\n autoCrop: true,\n maintainAspectRatio: true,\n aspectRatio: 1,\n resetCropOnAspectRatioChange: true,\n resizeToWidth: 0,\n resizeToHeight: 0,\n cropperMinWidth: 0,\n cropperMinHeight: 0,\n cropperMaxHeight: 0,\n cropperMaxWidth: 0,\n cropperStaticWidth: 0,\n cropperStaticHeight: 0,\n canvasRotation: 0,\n roundCropper: false,\n onlyScaleDown: false,\n imageQuality: 92,\n backgroundColor: null,\n containWithinAspectRatio: false,\n hideResizeSquares: false,\n alignImage: 'center',\n cropperFrameAriaLabel: undefined,\n checkImageType: true\n };\n\n // Internal\n cropperScaledMinWidth = 20;\n cropperScaledMinHeight = 20;\n cropperScaledMaxWidth = 20;\n cropperScaledMaxHeight = 20;\n stepSize = 3;\n\n setOptionsFromChanges(changes: SimpleChanges): void {\n if (changes['options']?.currentValue) {\n this.setOptions(changes['options'].currentValue);\n }\n const options = Object.entries(changes)\n .filter(([key]) => key in this.options)\n .reduce((acc, [key, change]) => ({\n ...acc,\n [key]: change.currentValue\n }), {} as Partial<CropperOptions>);\n if (Object.keys(options).length > 0) {\n this.setOptions(options);\n }\n }\n\n setOptions(options: Partial<CropperOptions>): void {\n this.options = {\n ...this.options,\n ...(options || {})\n };\n this.validateOptions();\n\n if (!this.loadedImage?.transformed.image.complete || !this.maxSize) {\n return;\n }\n\n let positionPossiblyChanged = false;\n if ((this.options.maintainAspectRatio && options['aspectRatio']) || 'maintainAspectRatio' in options) {\n this.setCropperScaledMinSize();\n this.setCropperScaledMaxSize();\n if (this.options.maintainAspectRatio && (this.options.resetCropOnAspectRatioChange || !this.aspectRatioIsCorrect())) {\n this.cropper.set(this.maxSizeCropperPosition());\n positionPossiblyChanged = true;\n }\n } else {\n if (options['cropperMinWidth'] || options['cropperMinHeight']) {\n this.setCropperScaledMinSize();\n positionPossiblyChanged = true;\n }\n if (options['cropperMaxWidth'] || options['cropperMaxHeight']) {\n this.setCropperScaledMaxSize();\n positionPossiblyChanged = true;\n }\n if (options['cropperStaticWidth'] || options['cropperStaticHeight']) {\n positionPossiblyChanged = true;\n }\n }\n\n if (positionPossiblyChanged) {\n this.cropper.update((cropper) => checkCropperPosition(cropper, this, false));\n }\n }\n\n private validateOptions(): void {\n if (this.options.maintainAspectRatio && !this.options.aspectRatio) {\n throw new Error('`aspectRatio` should > 0 when `maintainAspectRatio` is enabled');\n }\n }\n\n setMaxSize(width: number, height: number): void {\n this.maxSize = {width, height};\n this.setCropperScaledMinSize();\n this.setCropperScaledMaxSize();\n }\n\n setCropperScaledMinSize(): void {\n if (this.loadedImage?.transformed.size) {\n this.setCropperScaledMinWidth();\n this.setCropperScaledMinHeight();\n } else {\n this.cropperScaledMinWidth = 20;\n this.cropperScaledMinHeight = 20;\n }\n }\n\n setCropperScaledMinWidth(): void {\n this.cropperScaledMinWidth = this.options.cropperMinWidth > 0\n ? Math.max(20, this.options.cropperMinWidth / this.loadedImage!.transformed.size.width * this.maxSize!.width)\n : 20;\n }\n\n setCropperScaledMinHeight(): void {\n if (this.options.maintainAspectRatio) {\n this.cropperScaledMinHeight = Math.max(20, this.cropperScaledMinWidth / this.options.aspectRatio);\n } else if (this.options.cropperMinHeight > 0) {\n this.cropperScaledMinHeight = Math.max(\n 20,\n this.options.cropperMinHeight / this.loadedImage!.transformed.size.height * this.maxSize!.height\n );\n } else {\n this.cropperScaledMinHeight = 20;\n }\n }\n\n setCropperScaledMaxSize(): void {\n if (this.loadedImage?.transformed.size) {\n const ratio = this.loadedImage.transformed.size.width / this.maxSize!.width;\n this.cropperScaledMaxWidth = this.options.cropperMaxWidth > 20 ? this.options.cropperMaxWidth / ratio : this.maxSize!.width;\n this.cropperScaledMaxHeight = this.options.cropperMaxHeight > 20 ? this.options.cropperMaxHeight / ratio : this.maxSize!.height;\n if (this.options.maintainAspectRatio) {\n if (this.cropperScaledMaxWidth > this.cropperScaledMaxHeight * this.options.aspectRatio) {\n this.cropperScaledMaxWidth = this.cropperScaledMaxHeight * this.options.aspectRatio;\n } else if (this.cropperScaledMaxWidth < this.cropperScaledMaxHeight * this.options.aspectRatio) {\n this.cropperScaledMaxHeight = this.cropperScaledMaxWidth / this.options.aspectRatio;\n }\n }\n } else {\n this.cropperScaledMaxWidth = this.maxSize!.width;\n this.cropperScaledMaxHeight = this.maxSize!.height;\n }\n }\n\n equalsCropperPosition(cropper?: CropperPosition): boolean {\n const localCropper = this.cropper();\n return localCropper == null && cropper == null\n || localCropper != null && cropper != null\n && localCropper.x1.toFixed(3) === cropper.x1.toFixed(3)\n && localCropper.y1.toFixed(3) === cropper.y1.toFixed(3)\n && localCropper.x2.toFixed(3) === cropper.x2.toFixed(3)\n && localCropper.y2.toFixed(3) === cropper.y2.toFixed(3);\n }\n\n equalsTransformTranslate(transform: ImageTransform): boolean {\n return (this.transform.translateH ?? 0) === (transform.translateH ?? 0)\n && (this.transform.translateV ?? 0) === (transform.translateV ?? 0);\n }\n\n equalsTransform(transform: ImageTransform): boolean {\n return this.equalsTransformTranslate(transform)\n && (this.transform.scale ?? 1) === (transform.scale ?? 1)\n && (this.transform.rotate ?? 0) === (transform.rotate ?? 0)\n && (this.transform.flipH ?? false) === (transform.flipH ?? false)\n && (this.transform.flipV ?? false) === (transform.flipV ?? false);\n }\n\n aspectRatioIsCorrect(): boolean {\n const localCropper = this.cropper();\n const currentCropAspectRatio = (localCropper.x2 - localCropper.x1) / (localCropper.y2 - localCropper.y1);\n return currentCropAspectRatio === this.options.aspectRatio;\n }\n\n resizeCropperPosition(oldMaxSize: Dimensions): void {\n if (oldMaxSize.width !== this.maxSize!.width || oldMaxSize.height !== this.maxSize!.height) {\n this.cropper.update(cropper => ({\n x1: cropper.x1 * this.maxSize!.width / oldMaxSize.width,\n x2: cropper.x2 * this.maxSize!.width / oldMaxSize.width,\n y1: cropper.y1 * this.maxSize!.height / oldMaxSize.height,\n y2: cropper.y2 * this.maxSize!.height / oldMaxSize.height\n }));\n }\n }\n\n maxSizeCropperPosition(): CropperPosition {\n return {\n x1: 0,\n y1: 0,\n x2: this.maxSize!.width,\n y2: this.maxSize!.height\n };\n }\n}\n","import { CropperPosition, ImageTransform } from './';\n\nexport type Position = 'left' | 'topleft' | 'top' | 'topright' | 'right' | 'bottomright' | 'bottom' | 'bottomleft' | 'center';\n\nexport interface MoveStart {\n type: MoveTypes | null;\n position: Position | null;\n transform?: ImageTransform;\n cropper: CropperPosition;\n clientX: number;\n clientY: number;\n}\n\nexport enum MoveTypes {\n Drag = 'drag',\n Move = 'move',\n Resize = 'resize',\n Pinch = 'pinch'\n}\n","/*\n * Hermite resize - fast image resize/resample using Hermite filter.\n * https://github.com/viliusle/Hermite-resize\n */\n\nexport function resizeCanvas(canvas: HTMLCanvasElement, width: number, height: number) {\n const width_source = canvas.width;\n const height_source = canvas.height;\n width = Math.round(width);\n height = Math.round(height);\n\n const ratio_w = width_source / width;\n const ratio_h = height_source / height;\n const ratio_w_half = Math.ceil(ratio_w / 2);\n const ratio_h_half = Math.ceil(ratio_h / 2);\n\n const ctx = canvas.getContext('2d');\n if (ctx) {\n const img = ctx.getImageData(0, 0, width_source, height_source);\n const img2 = ctx.createImageData(width, height);\n const data = img.data;\n const data2 = img2.data;\n\n for (let j = 0; j < height; j++) {\n for (let i = 0; i < width; i++) {\n const x2 = (i + j * width) * 4;\n const center_y = j * ratio_h;\n let weight = 0;\n let weights = 0;\n let weights_alpha = 0;\n let gx_r = 0;\n let gx_g = 0;\n let gx_b = 0;\n let gx_a = 0;\n\n const xx_start = Math.floor(i * ratio_w);\n const yy_start = Math.floor(j * ratio_h);\n let xx_stop = Math.ceil((i + 1) * ratio_w);\n let yy_stop = Math.ceil((j + 1) * ratio_h);\n xx_stop = Math.min(xx_stop, width_source);\n yy_stop = Math.min(yy_stop, height_source);\n\n for (let yy = yy_start; yy < yy_stop; yy++) {\n const dy = Math.abs(center_y - yy) / ratio_h_half;\n const center_x = i * ratio_w;\n const w0 = dy * dy; //pre-calc part of w\n for (let xx = xx_start; xx < xx_stop; xx++) {\n const dx = Math.abs(center_x - xx) / ratio_w_half;\n const w = Math.sqrt(w0 + dx * dx);\n if (w >= 1) {\n //pixel too far\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n const pos_x = 4 * (xx + yy * width_source);\n //alpha\n gx_a += weight * data[pos_x + 3];\n weights_alpha += weight;\n //colors\n if (data[pos_x + 3] < 255)\n weight = weight * data[pos_x + 3] / 250;\n gx_r += weight * data[pos_x];\n gx_g += weight * data[pos_x + 1];\n gx_b += weight * data[pos_x + 2];\n weights += weight;\n }\n }\n data2[x2] = gx_r / weights;\n data2[x2 + 1] = gx_g / weights;\n data2[x2 + 2] = gx_b / weights;\n data2[x2 + 3] = gx_a / weights_alpha;\n }\n }\n\n\n canvas.width = width;\n canvas.height = height;\n\n //draw\n ctx.putImageData(img2, 0, 0);\n }\n}\n","export function percentage(percent: number, totalValue: number) {\n return (percent / 100) * totalValue;\n} ","import { CropperOptions, CropperPosition, ImageCroppedEvent } from '../interfaces';\nimport { CropperState } from '../component/cropper.state';\nimport { resizeCanvas } from '../utils/resize.utils';\nimport { percentage } from '../utils/percentage.utils';\nimport { OutputType } from '../interfaces/cropper-options.interface';\n\nexport class CropService {\n\n crop(cropperState: CropperState, output: 'blob'): Promise<ImageCroppedEvent> | null;\n crop(cropperState: CropperState, output: 'base64'): ImageCroppedEvent | null;\n crop(cropperState: CropperState, output: OutputType): Promise<ImageCroppedEvent> | ImageCroppedEvent | null {\n const imagePosition = this.getImagePosition(cropperState);\n const width = imagePosition.x2 - imagePosition.x1;\n const height = imagePosition.y2 - imagePosition.y1;\n const cropCanvas = document.createElement('canvas') as HTMLCanvasElement;\n cropCanvas.width = width;\n cropCanvas.height = height;\n\n const ctx = cropCanvas.getContext('2d');\n if (!ctx) {\n return null;\n }\n if (cropperState.options.backgroundColor != null) {\n ctx.fillStyle = cropperState.options.backgroundColor;\n ctx.fillRect(0, 0, width, height);\n }\n\n const scaleX = (cropperState.transform.scale || 1) * (cropperState.transform.flipH ? -1 : 1);\n const scaleY = (cropperState.transform.scale || 1) * (cropperState.transform.flipV ? -1 : 1);\n const {translateH, translateV} = this.getCanvasTranslate(cropperState);\n\n const transformedImage = cropperState.loadedImage!.transformed;\n ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);\n ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);\n ctx.rotate((cropperState.transform.rotate || 0) * Math.PI / 180);\n\n ctx.drawImage(\n transformedImage.image,\n -transformedImage.size.width / 2,\n -transformedImage.size.height / 2\n );\n\n const result: ImageCroppedEvent = {\n width, height,\n imagePosition,\n cropperPosition: {...cropperState.cropper()}\n };\n if (cropperState.options.containWithinAspectRatio) {\n result.offsetImagePosition = this.getOffsetImagePosition(cropperState);\n }\n const resizeRatio = this.getResizeRatio(width, height, cropperState.options);\n if (resizeRatio !== 1) {\n result.width = Math.round(width * resizeRatio);\n result.height = cropperState.options.maintainAspectRatio\n ? Math.round(result.width / cropperState.options.aspectRatio)\n : Math.round(height * resizeRatio);\n resizeCanvas(cropCanvas, result.width, result.height);\n }\n if (output === 'blob') {\n return this.cropToBlob(result, cropCanvas, cropperState);\n } else {\n result.base64 = cropCanvas.toDataURL('image/' + cropperState.options.format, this.getQuality(cropperState.options));\n return result;\n }\n }\n\n private async cropToBlob(output: ImageCroppedEvent, cropCanvas: HTMLCanvasElement, cropperState: CropperState): Promise<ImageCroppedEvent> {\n output.blob = await new Promise<Blob | null>(resolve => cropCanvas.toBlob(resolve, 'image/' + cropperState.options.format, this.getQuality(cropperState.options)));\n if (output.blob) {\n output.objectUrl = URL.createObjectURL(output.blob);\n }\n return output;\n }\n\n private getCanvasTranslate(cropperState: CropperState): { translateH: number, translateV: number } {\n if (cropperState.transform.translateUnit === 'px') {\n const ratio = this.getRatio(cropperState);\n return {\n translateH: (cropperState.transform.translateH || 0) * ratio,\n translateV: (cropperState.transform.translateV || 0) * ratio\n };\n } else {\n return {\n translateH: cropperState.transform.translateH ? percentage(cropperState.transform.translateH, cropperState.loadedImage!.transformed.size.width) : 0,\n translateV: cropperState.transform.translateV ? percentage(cropperState.transform.translateV, cropperState.loadedImage!.transformed.size.height) : 0\n };\n }\n }\n\n private getRatio(cropperState: CropperState): number {\n return cropperState.loadedImage!.transformed.size.width / cropperState.maxSize!.width;\n }\n\n private getImagePosition(cropperState: CropperState): CropperPosition {\n const ratio = this.getRatio(cropperState);\n const cropper = cropperState.cropper();\n const out: CropperPosition = {\n x1: Math.round(cropper.x1 * ratio),\n y1: Math.round(cropper.y1 * ratio),\n x2: Math.round(cropper.x2 * ratio),\n y2: Math.round(cropper.y2 * ratio)\n };\n\n if (!cropperState.options.containWithinAspectRatio) {\n out.x1 = Math.max(out.x1, 0);\n out.y1 = Math.max(out.y1, 0);\n out.x2 = Math.min(out.x2, cropperState.loadedImage!.transformed.size.width);\n out.y2 = Math.min(out.y2, cropperState.loadedImage!.transformed.size.height);\n }\n\n return out;\n }\n\n private getOffsetImagePosition(cropperState: CropperState): CropperPosition {\n const canvasRotation = cropperState.options.canvasRotation + cropperState.loadedImage!.exifTransform.rotate;\n const ratio = this.getRatio(cropperState);\n let offsetX: number;\n let offsetY: number;\n\n if (canvasRotation % 2) {\n offsetX = (cropperState.loadedImage!.transformed.size.width - cropperState.loadedImage!.original.size.height) / 2;\n offsetY = (cropperState.loadedImage!.transformed.size.height - cropperState.loadedImage!.original.size.width) / 2;\n } else {\n offsetX = (cropperState.loadedImage!.transformed.size.width - cropperState.loadedImage!.original.size.width) / 2;\n offsetY = (cropperState.loadedImage!.transformed.size.height - cropperState.loadedImage!.original.size.height) / 2;\n }\n\n const cropper = cropperState.cropper();\n const out: CropperPosition = {\n x1: Math.round(cropper.x1 * ratio) - offsetX,\n y1: Math.round(cropper.y1 * ratio) - offsetY,\n x2: Math.round(cropper.x2 * ratio) - offsetX,\n y2: Math.round(cropper.y2 * ratio) - offsetY\n };\n\n if (!cropperState.options.containWithinAspectRatio) {\n out.x1 = Math.max(out.x1, 0);\n out.y1 = Math.max(out.y1, 0);\n out.x2 = Math.min(out.x2, cropperState.loadedImage!.transformed.size.width);\n out.y2 = Math.min(out.y2, cropperState.loadedImage!.transformed.size.height);\n }\n\n return out;\n }\n\n getResizeRatio(width: number, height: number, options: CropperOptions): number {\n const ratioWidth = options.resizeToWidth / width;\n const ratioHeight = options.resizeToHeight / height;\n const ratios = new Array<number>();\n\n if (options.resizeToWidth > 0) {\n ratios.push(ratioWidth);\n }\n if (options.resizeToHeight > 0) {\n ratios.push(ratioHeight);\n }\n\n const result = ratios.length === 0 ? 1 : Math.min(...ratios);\n\n if (result > 1 && !options.onlyScaleDown) {\n return result;\n }\n return Math.min(result, 1);\n }\n\n getQuality(options: CropperOptions): number {\n return Math.min(1, Math.max(0, options.imageQuality / 100));\n }\n}\n","import { ExifTransform } from '../interfaces/exif-transform.interface';\n\n// Black 2x1 JPEG, with the following meta information set:\n// - EXIF Orientation: 6 (Rotated 90° CCW)\n// Source: https://github.com/blueimp/JavaScript-Load-Image\nconst testAutoOrientationImageByteArray = [new Uint8Array([255, 216, 255, 225, 0, 34, 69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 255, 219, 0, 132, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 255, 192, 0, 17, 8, 0, 1, 0, 2, 3, 1, 17, 0, 2, 17, 1, 3, 17, 1, 255, 196, 0, 74, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 218, 0, 12, 3, 1, 0, 2, 17, 3, 17, 0, 63, 0, 63, 240, 127, 255, 217])];\nconst testAutoOrientationImageURL = URL.createObjectURL(new Blob(testAutoOrientationImageByteArray, {type: 'image/jpeg'}));\n\nexport function supportsAutomaticRotation(): Promise<boolean> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n // Check if browser supports automatic image orientation:\n const supported = img.width === 1 && img.height === 2;\n resolve(supported);\n };\n img.src = testAutoOrientationImageURL;\n });\n}\n\nexport function getTransformationsFromExifData(exifRotationOrArrayBuffer: number | ArrayBufferLike): ExifTransform {\n if (typeof exifRotationOrArrayBuffer === 'object') {\n exifRotationOrArrayBuffer = getExifRotation(exifRotationOrArrayBuffer);\n }\n switch (exifRotationOrArrayBuffer) {\n case 2:\n return {rotate: 0, flip: true};\n case 3:\n return {rotate: 2, flip: false};\n case 4:\n return {rotate: 2, flip: true};\n case 5:\n return {rotate: 1, flip: true};\n case 6:\n return {rotate: 1, flip: false};\n case 7:\n return {rotate: 3, flip: true};\n case 8:\n return {rotate: 3, flip: false};\n default:\n return {rotate: 0, flip: false};\n }\n}\n\nfunction getExifRotation(arrayBuffer: ArrayBufferLike): number {\n const view = new DataView(arrayBuffer);\n if (view.getUint16(0, false) !== 0xFFD8) {\n return -2;\n }\n const length = view.byteLength;\n let offset = 2;\n while (offset < length) {\n if (view.getUint16(offset + 2, false) <= 8) return -1;\n const marker = view.getUint16(offset, false);\n offset += 2;\n if (marker == 0xFFE1) {\n if (view.getUint32(offset += 2, false) !== 0x45786966) {\n return -1;\n }\n\n const little = view.getUint16(offset += 6, false) == 0x4949;\n offset += view.getUint32(offset + 4, little);\n const tags = view.getUint16(offset, little);\n offset += 2;\n for (let i = 0; i < tags; i++) {\n if (view.getUint16(offset + (i * 12), little) == 0x0112) {\n return view.getUint16(offset + (i * 12) + 8, little);\n }\n }\n } else if ((marker & 0xFF00) !== 0xFF00) {\n break;\n } else {\n offset += view.getUint16(offset, false);\n }\n }\n return -1;\n}\n","import { Dimensions, LoadedImage } from '../interfaces';\nimport { CropperState } from '../component/cropper.state';\nimport { ExifTransform } from '../interfaces/exif-transform.interface';\nimport { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';\n\ninterface LoadImageArrayBuffer {\n originalImage: HTMLImageElement;\n originalArrayBuffer: ArrayBufferLike;\n originalObjectUrl: string;\n originalImageSize?: { width: number; height: number; } | null;\n}\n\nexport class LoadImageService {\n\n private autoRotateSupported: Promise<boolean> = supportsAutomaticRotation();\n\n async loadImageFile(file: File, cropperSettings: CropperState): Promise<LoadedImage> {\n const arrayBuffer = await file.arrayBuffer();\n if (cropperSettings.options.checkImageType) {\n return await this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings);\n }\n return await this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);\n }\n\n private checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer: ArrayBufferLike, imageType: string, cropperSettings: CropperState): Promise<LoadedImage> {\n if (!this.isValidImageType(imageType)) {\n return Promise.reject(new Error('Invalid image type'));\n }\n return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType);\n }\n\n private isValidImageType(type: string): boolean {\n return /image\\/(png|jpg|jpeg|heic|bmp|gif|tiff|svg|webp|x-icon|vnd.microsoft.icon)/.test(type);\n }\n\n async loadImageFromURL(url: string, cropperSettings: CropperState): Promise<LoadedImage> {\n const res = await fetch(url);\n const blob = await res.blob();\n const buffer = await blob.arrayBuffer();\n return await this.loadImageFromArrayBuffer(buffer, cropperSettings, blob.type);\n }\n\n loadBase64Image(imageBase64: string, cropperSettings: CropperState): Promise<LoadedImage> {\n const arrayBuffer = this.base64ToArrayBuffer(imageBase64);\n return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);\n }\n\n private base64ToArrayBuffer(imageBase64: string): ArrayBufferLike {\n imageBase64 = imageBase64.replace(/^data:([^;]+);base64,/gmi, '');\n const binaryString = atob(imageBase64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n\n private async loadImageFromArrayBuffer(arrayBuffer: ArrayBufferLike, cropperState: CropperState, imageType?: string): Promise<LoadedImage> {\n const res = await new Promise<LoadImageArrayBuffer>(async (resolve, reject) => {\n try {\n const blob = new Blob([arrayBuffer], imageType ? {type: imageType} : undefined);\n const objectUrl = URL.createObjectURL(blob);\n const originalImage = new Image();\n const isSvg = imageType === 'image/svg+xml';\n const originalImageSize = isSvg ? await this.getSvgImageSize(blob) : undefined;\n originalImage.onload = () => resolve({\n originalImage,\n originalImageSize,\n originalObjectUrl: objectUrl,\n originalArrayBuffer: arrayBuffer\n });\n originalImage.onerror = reject;\n originalImage.src = objectUrl;\n } catch (e) {\n reject(e);\n }\n });\n return await this.transformImageFromArrayBuffer(res, cropperState, res.originalImageSize != null);\n }\n\n private async getSvgImageSize(blob: Blob): Promise<{ width: number; height: number; } | null> {\n const parser = new DOMParser();\n const doc = parser.parseFromString(await blob.text(), 'image/svg+xml');\n const svgElement = doc.querySelector('svg');\n if (!svgElement) {\n throw Error('Failed to parse SVG image');\n }\n const widthAttr = svgElement.getAttribute('width');\n const heightAttr = svgElement.getAttribute('height');\n if (widthAttr && heightAttr) {\n return null;\n }\n const viewBoxAttr = svgElement.getAttribute('viewBox')\n || svgElement.getAttribute('viewbox');\n if (viewBoxAttr) {\n const viewBox = viewBoxAttr.split(' ');\n return {\n width: +viewBox[2],\n height: +viewBox[3]\n };\n }\n throw Error('Failed to load SVG image. SVG must have width + height or viewBox definition.');\n }\n\n private async transformImageFromArrayBuffer(res: LoadImageArrayBuffer, cropperSettings: CropperState, forceTransform = false): Promise<LoadedImage> {\n const autoRotate = await this.autoRotateSupported;\n const exifTransform = getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);\n if (!res.originalImage || !res.originalImage.complete) {\n return Promise.reject(new Error('No image loaded'));\n }\n const loadedImage = {\n original: {\n objectUrl: res.originalObjectUrl,\n image: res.originalImage,\n size: res.originalImageSize ?? {\n width: res.originalImage.naturalWidth,\n height: res.originalImage.naturalHeight\n }\n },\n exifTransform\n };\n return this.transformLoadedImage(loadedImage, cropperSettings, forceTransform);\n }\n\n async transformLoadedImage(loadedImage: Partial<LoadedImage>, cropperState: CropperState, forceTransform = false): Promise<LoadedImage> {\n const canvasRotation = cropperState.options.canvasRotation + loadedImage.exifTransform!.rotate;\n const originalSize = loadedImage.original!.size;\n if (!forceTransform && canvasRotation === 0 && !loadedImage.exifTransform!.flip && !cropperState.options.containWithinAspectRatio) {\n return {\n original: {\n objectUrl: loadedImage.original!.objectUrl,\n image: loadedImage.original!.image,\n size: {...originalSize}\n },\n transformed: {\n objectUrl: loadedImage.original!.objectUrl,\n image: loadedImage.original!.image,\n size: {...originalSize}\n },\n exifTransform: loadedImage.exifTransform!\n };\n }\n\n const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform!, cropperState);\n const canvas = document.createElement('canvas');\n canvas.width = transformedSize.width;\n canvas.height = transformedSize.height;\n const ctx = canvas.getContext('2d');\n ctx?.setTransform(\n loadedImage.exifTransform!.flip ? -1 : 1,\n 0,\n 0,\n 1,\n canvas.width / 2,\n canvas.height / 2\n );\n ctx?.rotate(Math.PI * (canvasRotation / 2));\n ctx?.drawImage(\n loadedImage.original!.image,\n -originalSize.width / 2,\n -originalSize.height / 2\n );\n const blob = await new Promise<Blob | null>(resolve => canvas.toBlob(resolve, cropperState.options.format));\n if (!blob) {\n throw new Error('Failed to get Blob for transformed image.');\n }\n const objectUrl = URL.createObjectURL(blob);\n const transformedImage = await this.loadImageFromObjectUrl(objectUrl);\n return {\n original: {\n objectUrl: loadedImage.original!.objectUrl,\n image: loadedImage.original!.image,\n size: {...originalSize}\n },\n transformed: {\n objectUrl: objectUrl,\n image: transformedImage,\n size: {\n width: transformedImage.width,\n height: transformedImage.height\n }\n },\n exifTransform: loadedImage.exifTransform!\n };\n }\n\n private loadImageFromObjectUrl(objectUrl: string): Promise<HTMLImageElement> {\n return new Promise<HTMLImageElement>(((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = reject;\n image.src = objectUrl;\n }));\n }\n\n private getTransformedSize(\n originalSize: { width: number, height: number },\n exifTransform: ExifTransform,\n cropperState: CropperState\n ): Dimensions {\n const canvasRotation = cropperState.options.canvasRotation + exifTransform.rotate;\n if (cropperState.options.containWithinAspectRatio) {\n if (canvasRotation % 2) {\n const minWidthToContain = originalSize.width * cropperState.options.aspectRatio;\n const minHeightToContain = originalSize.height / cropperState.options.aspectRatio;\n return {\n width: Math.max(originalSize.height, minWidthToContain),\n height: Math.max(originalSize.width, minHeightToContain)\n };\n } else {\n const minWidthToContain = originalSize.height * cropperState.options.aspectRatio;\n const minHeightToContain = originalSize.width / cropperState.options.aspectRatio;\n return {\n width: Math.max(originalSize.width, minWidthToContain),\n height: Math.max(originalSize.height, minHeightToContain)\n };\n }\n }\n\n if (canvasRotation % 2) {\n return {\n height: originalSize.width,\n width: originalSize.height\n };\n }\n return {\n width: originalSize.width,\n height: originalSize.height\n };\n }\n}\n","import {BasicEvent} from \"../interfaces/basic-event.interface\";\nimport {Position} from \"../interfaces/move-start.interface\";\n\nexport function getPositionForKey(key: string): Position {\n switch (key) {\n case 'ArrowUp':\n return 'top';\n case 'ArrowRight':\n return 'right';\n case 'ArrowDown':\n return 'bottom';\n case 'ArrowLeft':\n default:\n return 'left';\n }\n}\n\nexport function getInvertedPositionForKey(key: string): Position {\n switch (key) {\n case 'ArrowUp':\n return 'bottom';\n case 'ArrowRight':\n return 'left';\n case 'ArrowDown':\n return 'top';\n case 'ArrowLeft':\n default:\n return 'right';\n }\n}\n\nexport function getEventForKey(key: string, stepSize: number): BasicEvent {\n switch (key) {\n case 'ArrowUp':\n return {clientX: 0, clientY: stepSize * -1};\n case 'ArrowRight':\n return {clientX: stepSize, clientY: 0};\n case 'ArrowDown':\n return {clientX: 0, clientY: stepSize};\n case 'ArrowLeft':\n default:\n return {clientX: stepSize * -1, clientY: 0};\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n output,\n signal,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { DomSanitizer, SafeStyle, SafeUrl } from '@angular/platform-browser';\nimport {\n CropperOptions,\n CropperPosition,\n Dimensions,\n ImageCroppedEvent,\n ImageTransform,\n LoadedImage,\n MoveStart\n} from '../interfaces';\nimport { OutputFormat, OutputType } from '../interfaces/cropper-options.interface';\nimport { CropperState } from './cropper.state';\nimport { MoveTypes, Position } from '../interfaces/move-start.interface';\nimport { CropService } from '../services/crop.service';\nimport { LoadImageService } from '../services/load-image.service';\nimport { getEventForKey, getInvertedPositionForKey, getPositionForKey } from '../utils/keyboard.utils';\nimport { first, takeUntil } from 'rxjs/operators';\nimport { fromEvent, merge, Subject } from 'rxjs';\nimport { NgIf } from '@angular/common';\nimport { BasicEvent } from '../interfaces/basic-event.interface';\nimport {\n checkCropperPosition,\n checkCropperWithinMaxSizeBounds,\n getClientX,\n getClientY,\n moveCropper,\n resizeCropper\n} from '../utils/cropper-position.utils';\n\n@Component({\n selector: 'image-cropper',\n templateUrl: './image-cropper.component.html',\n styleUrls: ['./image-cropper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgIf],\n})\nexport class ImageCropperComponent implements OnChanges, OnInit, OnDestroy {\n\n private readonly pinchStart$ = new Subject<void>();\n private readonly cropService = new CropService();\n private readonly loadImageService = new LoadImageService();\n\n private setImageMaxSizeRetries = 0;\n private moveStart?: MoveStart;\n private resizedWhileHidden = false;\n\n protected readonly moveTypes = MoveTypes;\n protected readonly state = new CropperState();\n\n readonly safeImgDataUrl = signal<SafeUrl | string | undefined>(undefined);\n readonly safeTransformStyle = signal<SafeStyle | string | undefined>(undefined);\n marginLeft: SafeStyle | string = '0px';\n imageVisible = false;\n\n @ViewChild('wrapper', {static: true}) wrapper!: ElementRef<HTMLDivElement>;\n @ViewChild('sourceImage', {static: false}) sourceImage!: ElementRef<HTMLDivElement>;\n\n @Input() imageChangedEvent?: Event | null;\n @Input() imageURL?: string;\n @Input() imageBase64?: string;\n @Input() imageFile?: File;\n @Input() imageAltText?: string;\n\n @Input() options?: Partial<CropperOptions>;\n @Input() cropperFrameAriaLabel?: string;\n @Input() output?: 'blob' | 'base64';\n @Input() format?: OutputFormat;\n @Input() autoCrop?: boolean;\n @Input() cropper?: CropperPosition;\n @Input() transform?: ImageTransform;\n @Input() maintainAspectRatio?: boolean;\n @Input() aspectRatio?: number;\n @Input() resetCropOnAspectRatioChange?: boolean;\n @Input() resizeToWidth?: number;\n @Input() resizeToHeight?: number;\n @Input() cropperMinWidth?: number;\n @Input() cropperMinHeight?: number;\n @Input() cropperMaxHeight?: number;\n @Input() cropperMaxWidth?: number;\n @Input() cropperStaticWidth?: number;\n @Input() cropperStaticHeight?: number;\n @Input() canvasRotation?: number;\n @Input() initialStepSize?: number;\n @Input() roundCropper?: boolean;\n @Input() onlyScaleDown?: boolean;\n @Input() imageQuality?: number;\n @Input() backgroundColor?: string;\n @Input() containWithinAspectRatio?: boolean;\n @Input() hideResizeSquares?: boolean;\n @Input() allowMoveImage = false;\n @Input() checkImageType = true;\n @Input() alignImage?: 'left' | 'center';\n\n @HostBinding('class.disabled')\n @Input() disabled = false;\n @HostBinding('class.ngx-ic-hidden')\n @Input() hidden = false;\n\n readonly imageCropped = output<ImageCroppedEvent>();\n readonly startCropImage = output<void>();\n readonly imageLoaded = output<LoadedImage>();\n readonly cropperReady = output<Dimensions>();\n readonly loadImageFailed = output<void>();\n readonly transformChange = output<ImageTransform>();\n readonly cropperChange = output<CropperPosition>();\n\n @HostBinding('style.text-align')\n get alignImageStyle() {\n return this.state.options.alignImage;\n }\n\n constructor(\n private sanitizer: DomSanitizer\n ) {\n this.reset();\n }\n\n ngOnInit(): void {\n this.state.stepSize = this.initialStepSize || this.state.stepSize;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const previousCropperPosition = this.state.cropper();\n const previousTransform = this.state.transform;\n const previousBackgroundColor = this.state.options.backgroundColor;\n\n this.state.setOptionsFromChanges(changes);\n this.onChangesInputImage(changes);\n\n if (changes['transform'] && this.transform) {\n this.state.transform = this.transform;\n this.setCssTransform();\n }\n\n if (!this.state.loadedImage?.transformed.image.complete || !this.state.maxSize) {\n return;\n }\n\n if ((this.containWithinAspectRatio && changes['aspectRatio']) || changes['containWithinAspectRatio'] || changes['canvasRotation']) {\n this.loadImageService\n .transformLoadedImage(this.state.loadedImage, this.state)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n return;\n }\n\n if (changes['cropper'] && this.cropper) {\n this.state.cropper.set(checkCropperPosition(this.cropper, this.state, true));\n }\n const cropperChanged = !this.state.equalsCropperPosition(previousCropperPosition);\n if (cropperChanged && (!this.cropper || !this.state.equalsCropperPosition(this.cropper))) {\n this.cropperChange.emit(this.state.cropper());\n }\n if (cropperChanged\n || !this.state.equalsTransform(previousTransform)\n || this.state.options.backgroundColor !== previousBackgroundColor) {\n this.doAutoCrop();\n }\n\n if (changes['hidden'] && this.resizedWhileHidden && !this.hidden) {\n setTimeout(() => {\n this.onResize();\n this.resizedWhileHidden = false;\n });\n }\n }\n\n private onChangesInputImage(changes: SimpleChanges): void {\n if (changes['imageChangedEvent'] || changes['imageURL'] || changes['imageBase64'] || changes['imageFile']) {\n this.reset();\n }\n if (changes['imageChangedEvent'] && this.isValidImageChangedEvent()) {\n this.loadImageFile(this.imageChangedEvent.target.files[0]);\n }\n if (changes['imageURL'] && this.imageURL) {\n this.loadImageFromURL(this.imageURL);\n }\n if (changes['imageBase64'] && this.imageBase64) {\n this.loadBase64Image(this.imageBase64);\n }\n if (changes['imageFile'] && this.imageFile) {\n this.loadImageFile(this.imageFile);\n }\n }\n\n private isValidImageChangedEvent(): this is {\n imageChangedEvent: Event & {\n target: { files: FileList };\n }\n } {\n const files = (this.imageChangedEvent as any)?.target?.files;\n return files instanceof FileList && files.length > 0;\n }\n\n private reset(): void {\n this.state.loadedImage = undefined;\n this.state.maxSize = undefined;\n this.imageVisible = false;\n }\n\n private loadImageFile(file: File): void {\n this.loadImageService\n .loadImageFile(file, this.state)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private loadBase64Image(imageBase64: string): void {\n this.loadImageService\n .loadBase64Image(imageBase64, this.state)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private loadImageFromURL(url: string): void {\n this.loadImageService\n .loadImageFromURL(url, this.state)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private setLoadedImage(loadedImage: LoadedImage): void {\n this.state.loadedImage = loadedImage;\n this.safeImgDataUrl.set(this.sanitizer.bypassSecurityTrustResourceUrl(loadedImage.transformed.objectUrl));\n }\n\n loadImageError(error: unknown): void {\n console.error(error);\n this.loadImageFailed.emit();\n }\n\n private setCssTransform(): void {\n const translateUnit = this.state.transform?.translateUnit || '%';\n this.safeTransformStyle.set(this.sanitizer.bypassSecurityTrustStyle(\n `translate(${this.state.transform.translateH || 0}${translateUnit}, ${this.state.transform.translateV || 0}${translateUnit})` +\n ' scaleX(' + (this.state.transform.scale || 1) * (this.state.transform.flipH ? -1 : 1) + ')' +\n ' scaleY(' + (this.state.transform.scale || 1) * (this.state.transform.flipV ? -1 : 1) + ')' +\n ' rotate(' + (this.state.transform.rotate || 0) + 'deg)'\n ));\n }\n\n imageLoadedInView(): void {\n if (this.state.loadedImage != null) {\n this.imageLoaded.emit(this.state.loadedImage);\n this.setImageMaxSizeRetries = 0;\n setTimeout(() => this.checkImageMaxSizeRecursively());\n }\n }\n\n private checkImageMaxSizeRecursively(): void {\n if (this.setImageMaxSizeRetries > 40) {\n this.loadImageFailed.emit();\n } else if (this.sourceImageLoaded()) {\n this.setMaxSize();\n if (this.cropper && (!this.maintainAspectRatio || this.state.aspectRatioIsCorrect())) {\n this.state.cropper.set(checkCropperPosition(this.cropper, this.state, true));\n this.emitCropperPositionChange(this.cropper);\n } else {\n this.state.cropper.set(checkCropperPosition(this.state.maxSizeCropperPosition(), this.state, true));\n this.cropperChange.emit(this.state.cropper());\n }\n this.imageVisible = true;\n this.cropperReady.emit({...this.state.maxSize!});\n this.doAutoCrop();\n } else {\n this.setImageMaxSizeRetries++;\n setTimeout(() => this.checkImageMaxSizeRecursively(), 50);\n }\n }\n\n private sourceImageLoaded(): boolean {\n return this.sourceImage?.nativeElement?.offsetWidth > 1;\n }\n\n @HostListener('window:resize')\n onResize(): void {\n if (!this.state.loadedImage) {\n return;\n }\n if (this.hidden) {\n this.resizedWhileHidden = true;\n } else {\n const oldMaxSize = {...this.state.maxSize!};\n this.setMaxSize();\n this.state.resizeCropperPosition(oldMaxSize);\n }\n }\n\n keyboardAccess(event: KeyboardEvent) {\n this.changeKeyboardStepSize(event);\n this.keyboardMoveCropper(event);\n }\n\n private changeKeyboardStepSize(event: KeyboardEvent): void {\n const key = +event.key;\n if (key >= 1 && key <= 9) {\n this.state.stepSize = key;\n }\n }\n\n private keyboardMoveCropper(event: KeyboardEvent) {\n const keyboardWhiteList: string[] = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft'];\n if (!(keyboardWhiteList.includes(event.key))) {\n return;\n }\n const moveType = event.shiftKey ? MoveTypes.Resize : MoveTypes.Move;\n const position = event.altKey ? getInvertedPositionForKey(event.key) : getPositionForKey(event.key);\n const moveEvent = getEventForKey(event.key, this.state.stepSize);\n event.preventDefault();\n event.stopPropagation();\n this.moveStart = {\n type: moveType,\n position,\n clientX: 0,\n clientY: 0,\n transform: this.state.transform,\n cropper: this.state.cropper()\n };\n this.handleMouseMove(moveEvent);\n this.handleMouseUp();\n }\n\n startMove(event: Event | BasicEvent, moveType: MoveTypes, position: Position | null = null): void {\n if (this.disabled\n || this.moveStart && this.moveStart.type === MoveTypes.Pinch\n || moveType === MoveTypes.Drag && !this.allowMoveImage) {\n return;\n }\n if ('preventDefault' in event) {\n event.preventDefault();\n }\n this.moveStart = {\n type: moveType,\n position,\n clientX: getClientX(event),\n clientY: getClientY(event),\n transform: this.state.transform,\n cropper: this.state.cropper()\n };\n this.initMouseMove();\n }\n\n private initMouseMove(): void {\n merge(\n fromEvent(document, 'mousemove'),\n fromEvent(document, 'touchmove')\n ).pipe(\n takeUntil(merge(\n fromEvent(document, 'mouseup'),\n fromEvent(document, 'touchend'),\n this.pinchStart$\n ).pipe(first()))\n ).subscribe({\n next: (event) => this.handleMouseMove(event),\n complete: () => this.handleMouseUp()\n });\n }\n\n private handleMouseMove(event: Event | BasicEvent): void {\n if (!this.moveStart) {\n return;\n }\n if ('stopPropagation' in event) {\n event.stopPropagation();\n }\n if ('preventDefault' in event) {\n event.preventDefault();\n }\n if (this.moveStart.type === MoveTypes.Move) {\n this.state.cropper.set(checkCropperWithinMaxSizeBounds(\n moveCropper(event, this.moveStart),\n this.state,\n true\n ));\n } else if (this.moveStart.type === MoveTypes.Resize) {\n if (!this.cropperStaticWidth && !this.cropperStaticHeight) {\n this.state.cropper.set(checkCropperWithinMaxSizeBounds(\n resizeCropper(event, this.moveStart, this.state),\n this.state,\n false\n ));\n }\n } else if (this.moveStart.type === MoveTypes.Drag) {\n const diffX = getClientX(event) - this.moveStart.clientX;\n const diffY = getClientY(event) - this.moveStart.clientY;\n this.state.transform = {\n ...this.state.transform,\n translateH: (this.moveStart.transform?.translateH || 0) + diffX,\n translateV: (this.moveStart.transform?.translateV || 0) + diffY\n };\n this.setCssTransform();\n }\n }\n\n private handleMouseUp(): void {\n if (!this.moveStart || this.moveStart.type === MoveTypes.Pinch) {\n return;\n }\n if (!this.state.equalsCropperPosition(this.moveStart.cropper)\n || this.moveStart.transform && !this.state.equalsTransform(this.moveStart.transform)) {\n if (this.moveStart.type === MoveTypes.Drag) {\n this.transformChange.emit(this.state.transform);\n } else {\n this.cropperChange.emit(this.state.cropper());\n }\n this.doAutoCrop();\n }\n this.moveStart = undefined;\n }\n\n startPinch(event: TouchEvent) {\n if (this.disabled || !this.sourceImageLoaded() || event.touches.length < 2) {\n return;\n }\n if ('preventDefault' in event) {\n event.preventDefault();\n }\n const cropper = this.state.cropper();\n this.moveStart = {\n type: MoveTypes.Pinch,\n position: 'center',\n clientX: cropper.x1 + (cropper.x2 - cropper.x1) / 2,\n clientY: cropper.y1 + (cropper.y2 - cropper.y1) / 2,\n cropper: cropper\n };\n this.initPinch();\n }\n\n private initPinch(): void {\n this.pinchStart$.next();\n fromEvent(document, 'touchmove')\n .pipe(takeUntil(fromEvent(document, 'touchend')))\n .subscribe({\n next: (event) => this.handlePinchMove(event as TouchEvent),\n complete: () => this.handlePinchStop()\n });\n }\n\n private handlePinchMove(event: TouchEvent) {\n if (!this.moveStart) {\n return;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n if (this.moveStart.type === MoveTypes.Pinch) {\n if (!this.cropperStaticWidth && !this.cropperStaticHeight) {\n this.state.cropper.set(checkCropperWithinMaxSizeBounds(\n resizeCropper(event, this.moveStart, this.state),\n this.state,\n false\n ));\n }\n }\n }\n\n private handlePinchStop(): void {\n if (!this.moveStart) {\n return;\n }\n if (!this.state.equalsCropperPosition(this.moveStart.cropper)) {\n this.emitCropperPositionChange(this.moveStart.cropper);\n this.doAutoCrop();\n }\n this.moveStart = undefined;\n }\n\n private setMaxSize(): void {\n if (this.sourceImage) {\n const sourceImageStyle = getComputedStyle(this.sourceImage.nativeElement);\n this.state.setMaxSize(parseFloat(sourceImageStyle.width), parseFloat(sourceImageStyle.height));\n this.marginLeft = this.sanitizer.bypassSecurityTrustStyle('calc(50% - ' + this.state.maxSize!.width / 2 + 'px)');\n }\n }\n\n private emitCropperPositionChange(previousPosition: CropperPosition): void {\n if (!this.state.equalsCropperPosition(previousPosition)) {\n this.cropperChange.emit(this.state.cropper());\n }\n }\n\n private doAutoCrop(): void {\n if (this.state.options.autoCrop) {\n void this.crop();\n }\n }\n\n crop(): ImageCroppedEvent | null;\n crop(output: 'base64'): ImageCroppedEvent | null;\n crop(output: 'blob'): Promise<ImageCroppedEvent> | null;\n crop(output: OutputType = this.state.options.output): Promise<ImageCroppedEvent> | ImageCroppedEvent | null {\n if (this.state.loadedImage?.transformed?.image != null) {\n this.startCropImage.emit();\n if (output === 'blob') {\n return this.cropToBlob();\n } else if (output === 'base64') {\n return this.cropToBase64();\n }\n }\n return null;\n }\n\n private cropToBlob(): Promise<ImageCroppedEvent> | null {\n return new Promise(async (resolve, reject) => {\n const result = await this.cropService.crop(this.state, 'blob');\n if (result) {\n this.imageCropped.emit(result);\n resolve(result);\n } else {\n reject('Crop image failed');\n }\n });\n }\n\n private cropToBase64(): ImageCroppedEvent | null {\n const result = this.cropService.crop(this.state, 'base64');\n if (result) {\n this.imageCropped.emit(result);\n return result;\n }\n return null;\n }\n\n resetCropperPosition(): void {\n this.state.cropper.set(checkCropperPosition(this.state.maxSizeCropperPosition(), this.state, true));\n this.cropperChange.emit(this.state.cropper());\n }\n\n ngOnDestroy(): void {\n this.pinchStart$.complete();\n }\n}\n","<div\n [style.background]=\"imageVisible && state.options.backgroundColor\"\n (touchstart)=\"startPinch($event)\"\n>\n <img\n #sourceImage\n class=\"ngx-ic-source-image\"\n role=\"presentation\"\n *ngIf=\"safeImgDataUrl() as src\"\n [src]=\"src\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n [style.transform]=\"safeTransformStyle()\"\n [class.ngx-ic-draggable]=\"!disabled && allowMoveImage\"\n [attr.alt]=\"imageAltText\"\n (load)=\"imageLoadedInView()\"\n (mousedown)=\"startMove($event, moveTypes.Drag)\"\n (touchstart)=\"startMove($event, moveTypes.Drag)\"\n (error)=\"loadImageError($event)\"\n >\n <div\n class=\"ngx-ic-overlay\"\n [style.width.px]=\"state.maxSize?.width || 0\"\n [style.height.px]=\"state.maxSize?.height || 0\"\n [style.margin-left]=\"state.options.alignImage === 'center' ? marginLeft : null\"\n ></div>\n <div\n class=\"ngx-ic-cropper\"\n *ngIf=\"imageVisible\"\n [class.ngx-ic-round]=\"state.options.roundCropper\"\n [attr.aria-label]=\"state.options.cropperFrameAriaLabel\"\n [style.top.px]=\"state.cropper().y1\"\n [style.left.px]=\"state.cropper().x1\"\n [style.width.px]=\"state.cropper().x2 - state.cropper().x1\"\n [style.height.px]=\"state.cropper().y2 - state.cropper().y1\"\n [style.margin-left]=\"state.options.alignImage === 'center' ? marginLeft : null\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n (keydown)=\"keyboardAccess($event)\"\n tabindex=\"0\"\n >\n <div\n (mousedown)=\"startMove($event, moveTypes.Move)\"\n (touchstart)=\"startMove($event, moveTypes.Move)\"\n class=\"ngx-ic-move\"\n role=\"presentation\">\n </div>\n <ng-container\n *ngIf=\"!state.options.hideResizeSquares && !(state.options.cropperStaticWidth && state.options.cropperStaticHeight)\">\n <span\n class=\"ngx-ic-resize ngx-ic-topleft\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize ngx-ic-topright\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize ngx-ic-bottomright\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize ngx-ic-bottomleft\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize-bar ngx-ic-top\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\"\n ></span>\n\n <span\n class=\"ngx-ic-resize ngx-ic-top\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize-bar ngx-ic-right\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\"\n ></span>\n <span\n class=\"ngx-ic-resize ngx-ic-right\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize-bar ngx-ic-bottom\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n ></span>\n <span\n class=\"ngx-ic-resize ngx-ic-bottom\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize-bar ngx-ic-left\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\"\n ></span>\n <span\n class=\"ngx-ic-resize ngx-ic-left\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n </ng-container>\n </div>\n</div>\n","export function base64ToFile(base64Image: string): Blob {\n const split = base64Image.split(',');\n const type = split[0].replace('data:', '').replace(';base64', '');\n const byteString = atob(split[1]);\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i += 1) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ab], {type});\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAA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"}
|
|
1
|
+
{"version":3,"file":"ngx-image-cropper.mjs","sources":["../../../projects/ngx-image-cropper/src/lib/utils/cropper-position.utils.ts","../../../projects/ngx-image-cropper/src/lib/component/cropper.state.ts","../../../projects/ngx-image-cropper/src/lib/interfaces/move-start.interface.ts","../../../projects/ngx-image-cropper/src/lib/utils/resize.utils.ts","../../../projects/ngx-image-cropper/src/lib/utils/percentage.utils.ts","../../../projects/ngx-image-cropper/src/lib/services/crop.service.ts","../../../projects/ngx-image-cropper/src/lib/utils/exif.utils.ts","../../../projects/ngx-image-cropper/src/lib/services/load-image.service.ts","../../../projects/ngx-image-cropper/src/lib/utils/keyboard.utils.ts","../../../projects/ngx-image-cropper/src/lib/component/image-cropper.component.ts","../../../projects/ngx-image-cropper/src/lib/component/image-cropper.component.html","../../../projects/ngx-image-cropper/src/lib/utils/blob.utils.ts","../../../projects/ngx-image-cropper/src/ngx-image-cropper.ts"],"sourcesContent":["import { CropperPosition, MoveStart } from '../interfaces';\nimport { CropperState } from '../component/cropper.state';\nimport { BasicEvent } from '../interfaces/basic-event.interface';\n\nexport function checkCropperPosition(cropperPosition: CropperPosition, cropperState: CropperState, maintainSize: boolean): CropperPosition {\n cropperPosition = checkCropperSizeRestriction(cropperPosition, cropperState);\n return checkCropperWithinMaxSizeBounds(cropperPosition, cropperState, maintainSize);\n}\n\nexport function checkCropperSizeRestriction(cropperPosition: CropperPosition, cropperState: CropperState): CropperPosition {\n let cropperWidth = cropperPosition.x2 - cropperPosition.x1;\n let cropperHeight = cropperPosition.y2 - cropperPosition.y1;\n const centerX = cropperPosition.x1 + cropperWidth / 2;\n const centerY = cropperPosition.y1 + cropperHeight / 2;\n\n if (cropperState.options.cropperStaticHeight && cropperState.options.cropperStaticWidth) {\n cropperWidth = cropperState.maxSize().width > cropperState.options.cropperStaticWidth\n ? cropperState.options.cropperStaticWidth\n : cropperState.maxSize().width;\n cropperHeight = cropperState.maxSize().height > cropperState.options.cropperStaticHeight\n ? cropperState.options.cropperStaticHeight\n : cropperState.maxSize().height;\n } else {\n cropperWidth = Math.max(cropperState.cropperScaledMinWidth, Math.min(cropperWidth, cropperState.cropperScaledMaxWidth, cropperState.maxSize().width));\n cropperHeight = Math.max(cropperState.cropperScaledMinHeight, Math.min(cropperHeight, cropperState.cropperScaledMaxHeight, cropperState.maxSize().height));\n if (cropperState.options.maintainAspectRatio) {\n if (cropperState.maxSize().width / cropperState.options.aspectRatio < cropperState.maxSize().height) {\n cropperHeight = cropperWidth / cropperState.options.aspectRatio;\n } else {\n cropperWidth = cropperHeight * cropperState.options.aspectRatio;\n }\n }\n }\n\n const x1 = centerX - cropperWidth / 2;\n const x2 = x1 + cropperWidth;\n const y1 = centerY - cropperHeight / 2;\n const y2 = y1 + cropperHeight;\n return {x1, x2, y1, y2};\n}\n\nexport function checkCropperWithinMaxSizeBounds(position: CropperPosition, cropperState: CropperState, maintainSize = false): CropperPosition {\n if (position.x1 < 0) {\n position = {\n ...position,\n x1: 0,\n x2: position.x2 - (maintainSize ? position.x1 : 0)\n };\n }\n if (position.y1 < 0) {\n position = {\n ...position,\n y2: position.y2 - (maintainSize ? position.y1 : 0),\n y1: 0\n };\n }\n if (position.x2 > cropperState.maxSize().width) {\n position = {\n ...position,\n x1: position.x1 - (maintainSize ? (position.x2 - cropperState.maxSize().width) : 0),\n x2: cropperState.maxSize().width\n };\n }\n if (position.y2 > cropperState.maxSize().height) {\n position = {\n ...position,\n y1: position.y1 - (maintainSize ? (position.y2 - cropperState.maxSize().height) : 0),\n y2: cropperState.maxSize().height\n };\n }\n return position;\n}\n\nexport function moveCropper(event: Event | BasicEvent, moveStart: MoveStart): CropperPosition {\n const diffX = getClientX(event) - moveStart.clientX;\n const diffY = getClientY(event) - moveStart.clientY;\n\n return {\n x1: moveStart.cropper.x1 + diffX,\n y1: moveStart.cropper.y1 + diffY,\n x2: moveStart.cropper.x2 + diffX,\n y2: moveStart.cropper.y2 + diffY\n };\n}\n\nexport function resizeCropper(event: Event | BasicEvent, moveStart: MoveStart, cropperState: CropperState): CropperPosition {\n const cropperPosition = {...cropperState.cropper()};\n const moveX = getClientX(event) - moveStart.clientX;\n const moveY = getClientY(event) - moveStart.clientY;\n switch (moveStart.position) {\n case 'left':\n cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth),\n cropperPosition.x2 - cropperState.cropperScaledMinWidth);\n break;\n case 'topleft':\n cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth),\n cropperPosition.x2 - cropperState.cropperScaledMinWidth);\n cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight),\n cropperPosition.y2 - cropperState.cropperScaledMinHeight);\n break;\n case 'top':\n cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight),\n cropperPosition.y2 - cropperState.cropperScaledMinHeight);\n break;\n case 'topright':\n cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth),\n cropperPosition.x1 + cropperState.cropperScaledMinWidth);\n cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight),\n cropperPosition.y2 - cropperState.cropperScaledMinHeight);\n break;\n case 'right':\n cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth),\n cropperPosition.x1 + cropperState.cropperScaledMinWidth);\n break;\n case 'bottomright':\n cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth),\n cropperPosition.x1 + cropperState.cropperScaledMinWidth);\n cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight),\n cropperPosition.y1 + cropperState.cropperScaledMinHeight);\n break;\n case 'bottom':\n cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight),\n cropperPosition.y1 + cropperState.cropperScaledMinHeight);\n break;\n case 'bottomleft':\n cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth),\n cropperPosition.x2 - cropperState.cropperScaledMinWidth);\n cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight),\n cropperPosition.y1 + cropperState.cropperScaledMinHeight);\n break;\n case 'center':\n const scale = 'scale' in event ? event.scale as number : 1;\n const newWidth = Math.min(\n Math.max(cropperState.cropperScaledMinWidth, (Math.abs(moveStart.cropper.x2 - moveStart.cropper.x1)) * scale),\n cropperState.cropperScaledMaxWidth);\n const newHeight = Math.min(\n Math.max(cropperState.cropperScaledMinHeight, (Math.abs(moveStart.cropper.y2 - moveStart.cropper.y1)) * scale),\n cropperState.cropperScaledMaxHeight);\n cropperPosition.x1 = moveStart.clientX - newWidth / 2;\n cropperPosition.x2 = moveStart.clientX + newWidth / 2;\n cropperPosition.y1 = moveStart.clientY - newHeight / 2;\n cropperPosition.y2 = moveStart.clientY + newHeight / 2;\n if (cropperPosition.x1 < 0) {\n cropperPosition.x2 -= cropperPosition.x1;\n cropperPosition.x1 = 0;\n } else if (cropperPosition.x2 > cropperState.maxSize().width) {\n cropperPosition.x1 -= (cropperPosition.x2 - cropperState.maxSize().width);\n cropperPosition.x2 = cropperState.maxSize().width;\n }\n if (cropperPosition.y1 < 0) {\n cropperPosition.y2 -= cropperPosition.y1;\n cropperPosition.y1 = 0;\n } else if (cropperPosition.y2 > cropperState.maxSize().height) {\n cropperPosition.y1 -= (cropperPosition.y2 - cropperState.maxSize().height);\n cropperPosition.y2 = cropperState.maxSize().height;\n }\n break;\n }\n\n if (cropperState.options.maintainAspectRatio) {\n return checkAspectRatio(moveStart.position!, cropperPosition, cropperState);\n } else {\n return cropperPosition;\n }\n}\n\nexport function checkAspectRatio(position: string, cropperPosition: CropperPosition, cropperState: CropperState): CropperPosition {\n cropperPosition = {...cropperPosition};\n let overflowX = 0;\n let overflowY = 0;\n switch (position) {\n case 'top':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'bottom':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);\n overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize().height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : (overflowX / cropperState.options.aspectRatio);\n }\n break;\n case 'topleft':\n cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n overflowX = Math.max(0 - cropperPosition.x1, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'topright':\n cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);\n overflowY = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'right':\n case 'bottomright':\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);\n overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize().height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'left':\n case 'bottomleft':\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n overflowX = Math.max(0 - cropperPosition.x1, 0);\n overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize().height, 0);\n if (overflowX > 0 || overflowY > 0) {\n cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;\n cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;\n }\n break;\n case 'center':\n cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;\n cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;\n const overflowX1 = Math.max(0 - cropperPosition.x1, 0);\n const overflowX2 = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);\n const overflowY1 = Math.max(cropperPosition.y2 - cropperState.maxSize().height, 0);\n const overflowY2 = Math.max(0 - cropperPosition.y1, 0);\n if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {\n cropperPosition.x1 += (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? (overflowY1 * cropperState.options.aspectRatio) : overflowX1;\n cropperPosition.x2 -= (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? (overflowY2 * cropperState.options.aspectRatio) : overflowX2;\n cropperPosition.y1 += (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / cropperState.options.aspectRatio;\n cropperPosition.y2 -= (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / cropperState.options.aspectRatio;\n }\n break;\n }\n return cropperPosition;\n}\n\nexport function getClientX(event: Event | BasicEvent | TouchEvent): number {\n if ('touches' in event && event.touches[0]) {\n return event.touches[0].clientX;\n } else if ('clientX' in event) {\n return event.clientX;\n }\n\n return 0;\n}\n\nexport function getClientY(event: Event | BasicEvent | TouchEvent): number {\n if ('touches' in event && event.touches[0]) {\n return event.touches[0].clientY;\n } else if ('clientX' in event) {\n return event.clientY;\n }\n\n return 0;\n}\n","import { CropInput, CropperOptions, CropperPosition, Dimensions, ImageTransform, LoadedImage } from '../interfaces';\nimport { signal, SimpleChanges } from '@angular/core';\nimport { checkCropperPosition } from '../utils/cropper-position.utils';\n\nexport class CropperState {\n\n readonly cropper = signal<CropperPosition>({x1: 0, x2: 0, y1: 0, y2: 0});\n\n loadedImage?: LoadedImage;\n maxSize = signal<Dimensions>({ width: 0, height: 0 });\n transform: ImageTransform = {};\n options: CropperOptions = {\n format: 'png',\n output: 'blob',\n autoCrop: true,\n maintainAspectRatio: true,\n aspectRatio: 1,\n resetCropOnAspectRatioChange: true,\n resizeToWidth: 0,\n resizeToHeight: 0,\n cropperMinWidth: 0,\n cropperMinHeight: 0,\n cropperMaxHeight: 0,\n cropperMaxWidth: 0,\n cropperStaticWidth: 0,\n cropperStaticHeight: 0,\n canvasRotation: 0,\n roundCropper: false,\n onlyScaleDown: false,\n imageQuality: 92,\n backgroundColor: undefined,\n containWithinAspectRatio: false,\n hideResizeSquares: false,\n alignImage: 'center',\n cropperFrameAriaLabel: undefined,\n checkImageType: true\n };\n\n // Internal\n cropperScaledMinWidth = 20;\n cropperScaledMinHeight = 20;\n cropperScaledMaxWidth = 20;\n cropperScaledMaxHeight = 20;\n stepSize = 3;\n\n setOptionsFromChanges(changes: SimpleChanges): void {\n if (changes['options']?.currentValue) {\n this.setOptions(changes['options'].currentValue);\n }\n const options = Object.entries(changes)\n .filter(([key]) => key in this.options)\n .reduce((acc, [key, change]) => ({\n ...acc,\n [key]: change.currentValue\n }), {} as Partial<CropperOptions>);\n if (Object.keys(options).length > 0) {\n this.setOptions(options);\n }\n }\n\n setOptions(options: Partial<CropperOptions>): void {\n this.options = {\n ...this.options,\n ...(options || {})\n };\n this.validateOptions();\n\n if (!this.loadedImage?.transformed.image.complete || !this.maxSize) {\n return;\n }\n\n let positionPossiblyChanged = false;\n if ((this.options.maintainAspectRatio && options['aspectRatio']) || 'maintainAspectRatio' in options) {\n this.setCropperScaledMinSize();\n this.setCropperScaledMaxSize();\n if (this.options.maintainAspectRatio && (this.options.resetCropOnAspectRatioChange || !this.aspectRatioIsCorrect())) {\n this.cropper.set(this.maxSizeCropperPosition());\n positionPossiblyChanged = true;\n }\n } else {\n if (options['cropperMinWidth'] || options['cropperMinHeight']) {\n this.setCropperScaledMinSize();\n positionPossiblyChanged = true;\n }\n if (options['cropperMaxWidth'] || options['cropperMaxHeight']) {\n this.setCropperScaledMaxSize();\n positionPossiblyChanged = true;\n }\n if (options['cropperStaticWidth'] || options['cropperStaticHeight']) {\n positionPossiblyChanged = true;\n }\n }\n\n if (positionPossiblyChanged) {\n this.cropper.update((cropper) => checkCropperPosition(cropper, this, false));\n }\n }\n\n private validateOptions(): void {\n if (this.options.maintainAspectRatio && !this.options.aspectRatio) {\n throw new Error('`aspectRatio` should > 0 when `maintainAspectRatio` is enabled');\n }\n }\n\n setMaxSize(width: number, height: number): void {\n this.maxSize.set({ width, height });\n this.setCropperScaledMinSize();\n this.setCropperScaledMaxSize();\n }\n\n setCropperScaledMinSize(): void {\n if (this.loadedImage?.transformed.size) {\n this.setCropperScaledMinWidth();\n this.setCropperScaledMinHeight();\n } else {\n this.cropperScaledMinWidth = 20;\n this.cropperScaledMinHeight = 20;\n }\n }\n\n setCropperScaledMinWidth(): void {\n this.cropperScaledMinWidth = this.options.cropperMinWidth > 0\n ? Math.max(20, this.options.cropperMinWidth / this.loadedImage!.transformed.size.width * this.maxSize().width)\n : 20;\n }\n\n setCropperScaledMinHeight(): void {\n if (this.options.maintainAspectRatio) {\n this.cropperScaledMinHeight = Math.max(20, this.cropperScaledMinWidth / this.options.aspectRatio);\n } else if (this.options.cropperMinHeight > 0) {\n this.cropperScaledMinHeight = Math.max(\n 20,\n this.options.cropperMinHeight / this.loadedImage!.transformed.size.height * this.maxSize().height\n );\n } else {\n this.cropperScaledMinHeight = 20;\n }\n }\n\n setCropperScaledMaxSize(): void {\n if (this.loadedImage?.transformed.size) {\n const ratio = this.loadedImage.transformed.size.width / this.maxSize().width;\n this.cropperScaledMaxWidth = this.options.cropperMaxWidth > 20 ? this.options.cropperMaxWidth / ratio : this.maxSize().width;\n this.cropperScaledMaxHeight = this.options.cropperMaxHeight > 20 ? this.options.cropperMaxHeight / ratio : this.maxSize().height;\n if (this.options.maintainAspectRatio) {\n if (this.cropperScaledMaxWidth > this.cropperScaledMaxHeight * this.options.aspectRatio) {\n this.cropperScaledMaxWidth = this.cropperScaledMaxHeight * this.options.aspectRatio;\n } else if (this.cropperScaledMaxWidth < this.cropperScaledMaxHeight * this.options.aspectRatio) {\n this.cropperScaledMaxHeight = this.cropperScaledMaxWidth / this.options.aspectRatio;\n }\n }\n } else {\n this.cropperScaledMaxWidth = this.maxSize().width;\n this.cropperScaledMaxHeight = this.maxSize().height;\n }\n }\n\n equalsCropperPosition(cropper?: CropperPosition): boolean {\n const localCropper = this.cropper();\n return localCropper == null && cropper == null\n || localCropper != null && cropper != null\n && localCropper.x1.toFixed(3) === cropper.x1.toFixed(3)\n && localCropper.y1.toFixed(3) === cropper.y1.toFixed(3)\n && localCropper.x2.toFixed(3) === cropper.x2.toFixed(3)\n && localCropper.y2.toFixed(3) === cropper.y2.toFixed(3);\n }\n\n equalsTransformTranslate(transform: ImageTransform): boolean {\n return (this.transform.translateH ?? 0) === (transform.translateH ?? 0)\n && (this.transform.translateV ?? 0) === (transform.translateV ?? 0);\n }\n\n equalsTransform(transform: ImageTransform): boolean {\n return this.equalsTransformTranslate(transform)\n && (this.transform.scale ?? 1) === (transform.scale ?? 1)\n && (this.transform.rotate ?? 0) === (transform.rotate ?? 0)\n && (this.transform.flipH ?? false) === (transform.flipH ?? false)\n && (this.transform.flipV ?? false) === (transform.flipV ?? false);\n }\n\n aspectRatioIsCorrect(): boolean {\n const localCropper = this.cropper();\n const currentCropAspectRatio = (localCropper.x2 - localCropper.x1) / (localCropper.y2 - localCropper.y1);\n return currentCropAspectRatio === this.options.aspectRatio;\n }\n\n resizeCropperPosition(oldMaxSize: Dimensions): void {\n if (oldMaxSize.width !== this.maxSize().width || oldMaxSize.height !== this.maxSize().height) {\n this.cropper.update(cropper => ({\n x1: cropper.x1 * this.maxSize().width / oldMaxSize.width,\n x2: cropper.x2 * this.maxSize().width / oldMaxSize.width,\n y1: cropper.y1 * this.maxSize().height / oldMaxSize.height,\n y2: cropper.y2 * this.maxSize().height / oldMaxSize.height\n }));\n }\n }\n\n maxSizeCropperPosition(): CropperPosition {\n return {\n x1: 0,\n y1: 0,\n x2: this.maxSize().width,\n y2: this.maxSize().height\n };\n }\n\n toCropInput(): CropInput {\n return {\n cropper: this.cropper(),\n maxSize: this.maxSize(),\n transform: this.transform,\n loadedImage: this.loadedImage!,\n options: {...this.options}\n };\n }\n}\n","import { CropperPosition, ImageTransform } from './';\n\nexport type Position = 'left' | 'topleft' | 'top' | 'topright' | 'right' | 'bottomright' | 'bottom' | 'bottomleft' | 'center';\n\nexport interface MoveStart {\n type: MoveTypes | null;\n position: Position | null;\n transform?: ImageTransform;\n cropper: CropperPosition;\n clientX: number;\n clientY: number;\n}\n\nexport enum MoveTypes {\n Drag = 'drag',\n Move = 'move',\n Resize = 'resize',\n Pinch = 'pinch'\n}\n","/*\n * Hermite resize - fast image resize/resample using Hermite filter.\n * https://github.com/viliusle/Hermite-resize\n */\n\nexport function resizeCanvas(canvas: HTMLCanvasElement, width: number, height: number) {\n const width_source = canvas.width;\n const height_source = canvas.height;\n width = Math.round(width);\n height = Math.round(height);\n\n const ratio_w = width_source / width;\n const ratio_h = height_source / height;\n const ratio_w_half = Math.ceil(ratio_w / 2);\n const ratio_h_half = Math.ceil(ratio_h / 2);\n\n const ctx = canvas.getContext('2d');\n if (ctx) {\n const img = ctx.getImageData(0, 0, width_source, height_source);\n const img2 = ctx.createImageData(width, height);\n const data = img.data;\n const data2 = img2.data;\n\n for (let j = 0; j < height; j++) {\n for (let i = 0; i < width; i++) {\n const x2 = (i + j * width) * 4;\n const center_y = j * ratio_h;\n let weight = 0;\n let weights = 0;\n let weights_alpha = 0;\n let gx_r = 0;\n let gx_g = 0;\n let gx_b = 0;\n let gx_a = 0;\n\n const xx_start = Math.floor(i * ratio_w);\n const yy_start = Math.floor(j * ratio_h);\n let xx_stop = Math.ceil((i + 1) * ratio_w);\n let yy_stop = Math.ceil((j + 1) * ratio_h);\n xx_stop = Math.min(xx_stop, width_source);\n yy_stop = Math.min(yy_stop, height_source);\n\n for (let yy = yy_start; yy < yy_stop; yy++) {\n const dy = Math.abs(center_y - yy) / ratio_h_half;\n const center_x = i * ratio_w;\n const w0 = dy * dy; //pre-calc part of w\n for (let xx = xx_start; xx < xx_stop; xx++) {\n const dx = Math.abs(center_x - xx) / ratio_w_half;\n const w = Math.sqrt(w0 + dx * dx);\n if (w >= 1) {\n //pixel too far\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n const pos_x = 4 * (xx + yy * width_source);\n //alpha\n gx_a += weight * data[pos_x + 3];\n weights_alpha += weight;\n //colors\n if (data[pos_x + 3] < 255)\n weight = weight * data[pos_x + 3] / 250;\n gx_r += weight * data[pos_x];\n gx_g += weight * data[pos_x + 1];\n gx_b += weight * data[pos_x + 2];\n weights += weight;\n }\n }\n data2[x2] = gx_r / weights;\n data2[x2 + 1] = gx_g / weights;\n data2[x2 + 2] = gx_b / weights;\n data2[x2 + 3] = gx_a / weights_alpha;\n }\n }\n\n\n canvas.width = width;\n canvas.height = height;\n\n //draw\n ctx.putImageData(img2, 0, 0);\n }\n}\n","export function percentage(percent: number, totalValue: number) {\n return (percent / 100) * totalValue;\n} ","import { CropperPosition, ImageCroppedEvent } from '../interfaces';\nimport { resizeCanvas } from '../utils/resize.utils';\nimport { percentage } from '../utils/percentage.utils';\nimport { OutputType } from '../interfaces/cropper-options.interface';\nimport { CropInput } from '../interfaces/crop-input.interface';\n\nexport class CropService {\n\n crop(input: CropInput, output: 'blob'): Promise<ImageCroppedEvent> | null;\n crop(input: CropInput, output: 'base64'): ImageCroppedEvent | null;\n crop(input: CropInput, output: OutputType): Promise<ImageCroppedEvent> | ImageCroppedEvent | null {\n const imagePosition = this.getImagePosition(input);\n const width = imagePosition.x2 - imagePosition.x1;\n const height = imagePosition.y2 - imagePosition.y1;\n const cropCanvas = document.createElement('canvas') as HTMLCanvasElement;\n cropCanvas.width = width;\n cropCanvas.height = height;\n\n const ctx = cropCanvas.getContext('2d');\n if (!ctx) {\n return null;\n }\n if (input.options?.backgroundColor != null) {\n ctx.fillStyle = input.options.backgroundColor;\n ctx.fillRect(0, 0, width, height);\n }\n\n const scaleX = (input.transform?.scale || 1) * (input.transform?.flipH ? -1 : 1);\n const scaleY = (input.transform?.scale || 1) * (input.transform?.flipV ? -1 : 1);\n const {translateH, translateV} = this.getCanvasTranslate(input);\n\n const transformedImage = input.loadedImage!.transformed;\n ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);\n ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);\n ctx.rotate((input.transform?.rotate || 0) * Math.PI / 180);\n\n ctx.drawImage(\n transformedImage.image,\n -transformedImage.size.width / 2,\n -transformedImage.size.height / 2\n );\n\n const result: ImageCroppedEvent = {\n width, height,\n imagePosition,\n cropperPosition: {...input.cropper}\n };\n if (input.options?.containWithinAspectRatio) {\n result.offsetImagePosition = this.getOffsetImagePosition(input);\n }\n const resizeRatio = this.getResizeRatio(width, height, input.options);\n if (resizeRatio !== 1) {\n result.width = Math.round(width * resizeRatio);\n result.height = input.options?.maintainAspectRatio\n ? Math.round(result.width / (input.options?.aspectRatio ?? 1))\n : Math.round(height * resizeRatio);\n resizeCanvas(cropCanvas, result.width, result.height);\n }\n if (output === 'blob') {\n return this.cropToBlob(result, cropCanvas, input);\n } else {\n result.base64 = cropCanvas.toDataURL('image/' + (input.options?.format ?? 'png'), this.getQuality(input.options));\n return result;\n }\n }\n\n private async cropToBlob(output: ImageCroppedEvent, cropCanvas: HTMLCanvasElement, input: CropInput): Promise<ImageCroppedEvent> {\n output.blob = await new Promise<Blob | null>(resolve => cropCanvas.toBlob(resolve, 'image/' + (input.options?.format ?? 'png'), this.getQuality(input.options)));\n if (output.blob) {\n output.objectUrl = URL.createObjectURL(output.blob);\n }\n return output;\n }\n\n private getCanvasTranslate(input: CropInput): { translateH: number, translateV: number } {\n if (input.transform?.translateUnit === 'px') {\n const ratio = this.getRatio(input);\n return {\n translateH: (input.transform?.translateH || 0) * ratio,\n translateV: (input.transform?.translateV || 0) * ratio\n };\n } else {\n return {\n translateH: input.transform?.translateH ? percentage(input.transform.translateH, input.loadedImage!.transformed.size.width) : 0,\n translateV: input.transform?.translateV ? percentage(input.transform.translateV, input.loadedImage!.transformed.size.height) : 0\n };\n }\n }\n\n private getRatio(input: CropInput): number {\n return input.loadedImage!.transformed.size.width / input.maxSize.width;\n }\n\n private getImagePosition(cropperState: CropInput): CropperPosition {\n const ratio = this.getRatio(cropperState);\n const out: CropperPosition = {\n x1: Math.round(cropperState.cropper.x1 * ratio),\n y1: Math.round(cropperState.cropper.y1 * ratio),\n x2: Math.round(cropperState.cropper.x2 * ratio),\n y2: Math.round(cropperState.cropper.y2 * ratio)\n };\n\n if (!cropperState.options?.containWithinAspectRatio) {\n out.x1 = Math.max(out.x1, 0);\n out.y1 = Math.max(out.y1, 0);\n out.x2 = Math.min(out.x2, cropperState.loadedImage!.transformed.size.width);\n out.y2 = Math.min(out.y2, cropperState.loadedImage!.transformed.size.height);\n }\n\n return out;\n }\n\n private getOffsetImagePosition(input: CropInput): CropperPosition {\n const canvasRotation = (input.options?.canvasRotation ?? 0) + input.loadedImage!.exifTransform.rotate;\n const ratio = this.getRatio(input);\n let offsetX: number;\n let offsetY: number;\n\n if (canvasRotation % 2) {\n offsetX = (input.loadedImage!.transformed.size.width - input.loadedImage!.original.size.height) / 2;\n offsetY = (input.loadedImage!.transformed.size.height - input.loadedImage!.original.size.width) / 2;\n } else {\n offsetX = (input.loadedImage!.transformed.size.width - input.loadedImage!.original.size.width) / 2;\n offsetY = (input.loadedImage!.transformed.size.height - input.loadedImage!.original.size.height) / 2;\n }\n\n const cropper = input.cropper;\n const out: CropperPosition = {\n x1: Math.round(cropper.x1 * ratio) - offsetX,\n y1: Math.round(cropper.y1 * ratio) - offsetY,\n x2: Math.round(cropper.x2 * ratio) - offsetX,\n y2: Math.round(cropper.y2 * ratio) - offsetY\n };\n\n if (!input.options?.containWithinAspectRatio) {\n out.x1 = Math.max(out.x1, 0);\n out.y1 = Math.max(out.y1, 0);\n out.x2 = Math.min(out.x2, input.loadedImage!.transformed.size.width);\n out.y2 = Math.min(out.y2, input.loadedImage!.transformed.size.height);\n }\n\n return out;\n }\n\n getResizeRatio(width: number, height: number, options?: {\n resizeToWidth?: number;\n resizeToHeight?: number;\n onlyScaleDown?: boolean;\n }): number {\n const ratios = new Array<number>();\n if (options?.resizeToWidth && options.resizeToWidth > 0) {\n ratios.push(options.resizeToWidth / width);\n }\n if (options?.resizeToHeight && options.resizeToHeight > 0) {\n ratios.push(options.resizeToHeight / height);\n }\n\n const result = ratios.length === 0 ? 1 : Math.min(...ratios);\n\n if (result > 1 && !options?.onlyScaleDown) {\n return result;\n }\n return Math.min(result, 1);\n }\n\n getQuality(options?: { imageQuality?: number }): number {\n return Math.min(1, Math.max(0, options?.imageQuality ?? 92 / 100));\n }\n}\n","import { ExifTransform } from '../interfaces/exif-transform.interface';\n\n// Black 2x1 JPEG, with the following meta information set:\n// - EXIF Orientation: 6 (Rotated 90° CCW)\n// Source: https://github.com/blueimp/JavaScript-Load-Image\nconst testAutoOrientationImageByteArray = [new Uint8Array([255, 216, 255, 225, 0, 34, 69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 1, 1, 18, 0, 3, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 0, 255, 219, 0, 132, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 255, 192, 0, 17, 8, 0, 1, 0, 2, 3, 1, 17, 0, 2, 17, 1, 3, 17, 1, 255, 196, 0, 74, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 218, 0, 12, 3, 1, 0, 2, 17, 3, 17, 0, 63, 0, 63, 240, 127, 255, 217])];\nconst testAutoOrientationImageURL = URL.createObjectURL(new Blob(testAutoOrientationImageByteArray, {type: 'image/jpeg'}));\n\nexport function supportsAutomaticRotation(): Promise<boolean> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n // Check if browser supports automatic image orientation:\n const supported = img.width === 1 && img.height === 2;\n resolve(supported);\n };\n img.src = testAutoOrientationImageURL;\n });\n}\n\nexport function getTransformationsFromExifData(exifRotationOrArrayBuffer: number | ArrayBufferLike): ExifTransform {\n if (typeof exifRotationOrArrayBuffer === 'object') {\n exifRotationOrArrayBuffer = getExifRotation(exifRotationOrArrayBuffer);\n }\n switch (exifRotationOrArrayBuffer) {\n case 2:\n return {rotate: 0, flip: true};\n case 3:\n return {rotate: 2, flip: false};\n case 4:\n return {rotate: 2, flip: true};\n case 5:\n return {rotate: 1, flip: true};\n case 6:\n return {rotate: 1, flip: false};\n case 7:\n return {rotate: 3, flip: true};\n case 8:\n return {rotate: 3, flip: false};\n default:\n return {rotate: 0, flip: false};\n }\n}\n\nfunction getExifRotation(arrayBuffer: ArrayBufferLike): number {\n const view = new DataView(arrayBuffer);\n if (view.getUint16(0, false) !== 0xFFD8) {\n return -2;\n }\n const length = view.byteLength;\n let offset = 2;\n while (offset < length) {\n if (view.getUint16(offset + 2, false) <= 8) return -1;\n const marker = view.getUint16(offset, false);\n offset += 2;\n if (marker == 0xFFE1) {\n if (view.getUint32(offset += 2, false) !== 0x45786966) {\n return -1;\n }\n\n const little = view.getUint16(offset += 6, false) == 0x4949;\n offset += view.getUint32(offset + 4, little);\n const tags = view.getUint16(offset, little);\n offset += 2;\n for (let i = 0; i < tags; i++) {\n if (view.getUint16(offset + (i * 12), little) == 0x0112) {\n return view.getUint16(offset + (i * 12) + 8, little);\n }\n }\n } else if ((marker & 0xFF00) !== 0xFF00) {\n break;\n } else {\n offset += view.getUint16(offset, false);\n }\n }\n return -1;\n}\n","import { Dimensions, LoadedImage } from '../interfaces';\nimport { CropperState } from '../component/cropper.state';\nimport { ExifTransform } from '../interfaces/exif-transform.interface';\nimport { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';\n\ninterface LoadImageArrayBuffer {\n originalImage: HTMLImageElement;\n originalArrayBuffer: ArrayBufferLike;\n originalObjectUrl: string;\n originalImageSize?: { width: number; height: number; } | null;\n}\n\nexport class LoadImageService {\n\n private autoRotateSupported: Promise<boolean> = supportsAutomaticRotation();\n\n async loadImageFile(file: File, cropperSettings: CropperState): Promise<LoadedImage> {\n const arrayBuffer = await file.arrayBuffer();\n if (cropperSettings.options.checkImageType) {\n return await this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings);\n }\n return await this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);\n }\n\n private checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer: ArrayBufferLike, imageType: string, cropperSettings: CropperState): Promise<LoadedImage> {\n if (!this.isValidImageType(imageType)) {\n return Promise.reject(new Error('Invalid image type'));\n }\n return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType);\n }\n\n private isValidImageType(type: string): boolean {\n return /image\\/(png|jpg|jpeg|heic|bmp|gif|tiff|svg|webp|x-icon|vnd.microsoft.icon)/.test(type);\n }\n\n async loadImageFromURL(url: string, cropperSettings: CropperState): Promise<LoadedImage> {\n const res = await fetch(url);\n const blob = await res.blob();\n const buffer = await blob.arrayBuffer();\n return await this.loadImageFromArrayBuffer(buffer, cropperSettings, blob.type);\n }\n\n loadBase64Image(imageBase64: string, cropperSettings: CropperState): Promise<LoadedImage> {\n const arrayBuffer = this.base64ToArrayBuffer(imageBase64);\n return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);\n }\n\n private base64ToArrayBuffer(imageBase64: string): ArrayBufferLike {\n imageBase64 = imageBase64.replace(/^data:([^;]+);base64,/gmi, '');\n const binaryString = atob(imageBase64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n\n private async loadImageFromArrayBuffer(arrayBuffer: ArrayBufferLike, cropperState: CropperState, imageType?: string): Promise<LoadedImage> {\n const res = await new Promise<LoadImageArrayBuffer>(async (resolve, reject) => {\n try {\n const blob = new Blob([arrayBuffer], imageType ? {type: imageType} : undefined);\n const objectUrl = URL.createObjectURL(blob);\n const originalImage = new Image();\n const isSvg = imageType === 'image/svg+xml';\n const originalImageSize = isSvg ? await this.getSvgImageSize(blob) : undefined;\n originalImage.onload = () => resolve({\n originalImage,\n originalImageSize,\n originalObjectUrl: objectUrl,\n originalArrayBuffer: arrayBuffer\n });\n originalImage.onerror = reject;\n originalImage.src = objectUrl;\n } catch (e) {\n reject(e);\n }\n });\n return await this.transformImageFromArrayBuffer(res, cropperState, res.originalImageSize != null);\n }\n\n private async getSvgImageSize(blob: Blob): Promise<{ width: number; height: number; } | null> {\n const parser = new DOMParser();\n const doc = parser.parseFromString(await blob.text(), 'image/svg+xml');\n const svgElement = doc.querySelector('svg');\n if (!svgElement) {\n throw Error('Failed to parse SVG image');\n }\n const widthAttr = svgElement.getAttribute('width');\n const heightAttr = svgElement.getAttribute('height');\n if (widthAttr && heightAttr) {\n return null;\n }\n const viewBoxAttr = svgElement.getAttribute('viewBox')\n || svgElement.getAttribute('viewbox');\n if (viewBoxAttr) {\n const viewBox = viewBoxAttr.split(' ');\n return {\n width: +viewBox[2],\n height: +viewBox[3]\n };\n }\n throw Error('Failed to load SVG image. SVG must have width + height or viewBox definition.');\n }\n\n private async transformImageFromArrayBuffer(res: LoadImageArrayBuffer, cropperSettings: CropperState, forceTransform = false): Promise<LoadedImage> {\n const autoRotate = await this.autoRotateSupported;\n const exifTransform = getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);\n if (!res.originalImage || !res.originalImage.complete) {\n return Promise.reject(new Error('No image loaded'));\n }\n const loadedImage = {\n original: {\n objectUrl: res.originalObjectUrl,\n image: res.originalImage,\n size: res.originalImageSize ?? {\n width: res.originalImage.naturalWidth,\n height: res.originalImage.naturalHeight\n }\n },\n exifTransform\n };\n return this.transformLoadedImage(loadedImage, cropperSettings, forceTransform);\n }\n\n async transformLoadedImage(loadedImage: Partial<LoadedImage>, cropperState: CropperState, forceTransform = false): Promise<LoadedImage> {\n const canvasRotation = cropperState.options.canvasRotation + loadedImage.exifTransform!.rotate;\n const originalSize = loadedImage.original!.size;\n if (!forceTransform && canvasRotation === 0 && !loadedImage.exifTransform!.flip && !cropperState.options.containWithinAspectRatio) {\n return {\n original: {\n objectUrl: loadedImage.original!.objectUrl,\n image: loadedImage.original!.image,\n size: {...originalSize}\n },\n transformed: {\n objectUrl: loadedImage.original!.objectUrl,\n image: loadedImage.original!.image,\n size: {...originalSize}\n },\n exifTransform: loadedImage.exifTransform!\n };\n }\n\n const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform!, cropperState);\n const canvas = document.createElement('canvas');\n canvas.width = transformedSize.width;\n canvas.height = transformedSize.height;\n const ctx = canvas.getContext('2d');\n ctx?.setTransform(\n loadedImage.exifTransform!.flip ? -1 : 1,\n 0,\n 0,\n 1,\n canvas.width / 2,\n canvas.height / 2\n );\n ctx?.rotate(Math.PI * (canvasRotation / 2));\n ctx?.drawImage(\n loadedImage.original!.image,\n -originalSize.width / 2,\n -originalSize.height / 2\n );\n const blob = await new Promise<Blob | null>(resolve => canvas.toBlob(resolve, cropperState.options.format));\n if (!blob) {\n throw new Error('Failed to get Blob for transformed image.');\n }\n const objectUrl = URL.createObjectURL(blob);\n const transformedImage = await this.loadImageFromObjectUrl(objectUrl);\n return {\n original: {\n objectUrl: loadedImage.original!.objectUrl,\n image: loadedImage.original!.image,\n size: {...originalSize}\n },\n transformed: {\n objectUrl: objectUrl,\n image: transformedImage,\n size: {\n width: transformedImage.width,\n height: transformedImage.height\n }\n },\n exifTransform: loadedImage.exifTransform!\n };\n }\n\n private loadImageFromObjectUrl(objectUrl: string): Promise<HTMLImageElement> {\n return new Promise<HTMLImageElement>(((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = reject;\n image.src = objectUrl;\n }));\n }\n\n private getTransformedSize(\n originalSize: { width: number, height: number },\n exifTransform: ExifTransform,\n cropperState: CropperState\n ): Dimensions {\n const canvasRotation = cropperState.options.canvasRotation + exifTransform.rotate;\n if (cropperState.options.containWithinAspectRatio) {\n if (canvasRotation % 2) {\n const minWidthToContain = originalSize.width * cropperState.options.aspectRatio;\n const minHeightToContain = originalSize.height / cropperState.options.aspectRatio;\n return {\n width: Math.max(originalSize.height, minWidthToContain),\n height: Math.max(originalSize.width, minHeightToContain)\n };\n } else {\n const minWidthToContain = originalSize.height * cropperState.options.aspectRatio;\n const minHeightToContain = originalSize.width / cropperState.options.aspectRatio;\n return {\n width: Math.max(originalSize.width, minWidthToContain),\n height: Math.max(originalSize.height, minHeightToContain)\n };\n }\n }\n\n if (canvasRotation % 2) {\n return {\n height: originalSize.width,\n width: originalSize.height\n };\n }\n return {\n width: originalSize.width,\n height: originalSize.height\n };\n }\n}\n","import {BasicEvent} from \"../interfaces/basic-event.interface\";\nimport {Position} from \"../interfaces/move-start.interface\";\n\nexport function getPositionForKey(key: string): Position {\n switch (key) {\n case 'ArrowUp':\n return 'top';\n case 'ArrowRight':\n return 'right';\n case 'ArrowDown':\n return 'bottom';\n case 'ArrowLeft':\n default:\n return 'left';\n }\n}\n\nexport function getInvertedPositionForKey(key: string): Position {\n switch (key) {\n case 'ArrowUp':\n return 'bottom';\n case 'ArrowRight':\n return 'left';\n case 'ArrowDown':\n return 'top';\n case 'ArrowLeft':\n default:\n return 'right';\n }\n}\n\nexport function getEventForKey(key: string, stepSize: number): BasicEvent {\n switch (key) {\n case 'ArrowUp':\n return {clientX: 0, clientY: stepSize * -1};\n case 'ArrowRight':\n return {clientX: stepSize, clientY: 0};\n case 'ArrowDown':\n return {clientX: 0, clientY: stepSize};\n case 'ArrowLeft':\n default:\n return {clientX: stepSize * -1, clientY: 0};\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n output,\n signal,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { DomSanitizer, SafeStyle, SafeUrl } from '@angular/platform-browser';\nimport {\n CropperOptions,\n CropperPosition,\n Dimensions,\n ImageCroppedEvent,\n ImageTransform,\n LoadedImage,\n MoveStart\n} from '../interfaces';\nimport { OutputFormat, OutputType } from '../interfaces/cropper-options.interface';\nimport { CropperState } from './cropper.state';\nimport { MoveTypes, Position } from '../interfaces/move-start.interface';\nimport { CropService } from '../services/crop.service';\nimport { LoadImageService } from '../services/load-image.service';\nimport { getEventForKey, getInvertedPositionForKey, getPositionForKey } from '../utils/keyboard.utils';\nimport { first, takeUntil } from 'rxjs/operators';\nimport { fromEvent, merge, Subject } from 'rxjs';\nimport { NgIf } from '@angular/common';\nimport { BasicEvent } from '../interfaces/basic-event.interface';\nimport {\n checkCropperPosition,\n checkCropperWithinMaxSizeBounds,\n getClientX,\n getClientY,\n moveCropper,\n resizeCropper\n} from '../utils/cropper-position.utils';\n\n@Component({\n selector: 'image-cropper',\n templateUrl: './image-cropper.component.html',\n styleUrls: ['./image-cropper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgIf],\n})\nexport class ImageCropperComponent implements OnChanges, OnInit, OnDestroy {\n\n private readonly pinchStart$ = new Subject<void>();\n private readonly cropService = new CropService();\n private readonly loadImageService = new LoadImageService();\n\n private setImageMaxSizeRetries = 0;\n private moveStart?: MoveStart;\n private resizedWhileHidden = false;\n\n protected readonly moveTypes = MoveTypes;\n protected readonly state = new CropperState();\n\n readonly safeImgDataUrl = signal<SafeUrl | string | undefined>(undefined);\n readonly safeTransformStyle = signal<SafeStyle | string | undefined>(undefined);\n marginLeft: SafeStyle | string = '0px';\n imageVisible = false;\n\n @ViewChild('wrapper', {static: true}) wrapper!: ElementRef<HTMLDivElement>;\n @ViewChild('sourceImage', {static: false}) sourceImage!: ElementRef<HTMLDivElement>;\n\n @Input() imageChangedEvent?: Event | null;\n @Input() imageURL?: string;\n @Input() imageBase64?: string;\n @Input() imageFile?: File;\n @Input() imageAltText?: string;\n\n @Input() options?: Partial<CropperOptions>;\n @Input() cropperFrameAriaLabel?: string;\n @Input() output?: 'blob' | 'base64';\n @Input() format?: OutputFormat;\n @Input() autoCrop?: boolean;\n @Input() cropper?: CropperPosition;\n @Input() transform?: ImageTransform;\n @Input() maintainAspectRatio?: boolean;\n @Input() aspectRatio?: number;\n @Input() resetCropOnAspectRatioChange?: boolean;\n @Input() resizeToWidth?: number;\n @Input() resizeToHeight?: number;\n @Input() cropperMinWidth?: number;\n @Input() cropperMinHeight?: number;\n @Input() cropperMaxHeight?: number;\n @Input() cropperMaxWidth?: number;\n @Input() cropperStaticWidth?: number;\n @Input() cropperStaticHeight?: number;\n @Input() canvasRotation?: number;\n @Input() initialStepSize?: number;\n @Input() roundCropper?: boolean;\n @Input() onlyScaleDown?: boolean;\n @Input() imageQuality?: number;\n @Input() backgroundColor?: string;\n @Input() containWithinAspectRatio?: boolean;\n @Input() hideResizeSquares?: boolean;\n @Input() allowMoveImage = false;\n @Input() checkImageType = true;\n @Input() alignImage?: 'left' | 'center';\n\n @HostBinding('class.disabled')\n @Input() disabled = false;\n @HostBinding('class.ngx-ic-hidden')\n @Input() hidden = false;\n\n readonly imageCropped = output<ImageCroppedEvent>();\n readonly startCropImage = output<void>();\n readonly imageLoaded = output<LoadedImage>();\n readonly cropperReady = output<Dimensions>();\n readonly loadImageFailed = output<void>();\n readonly transformChange = output<ImageTransform>();\n readonly cropperChange = output<CropperPosition>();\n\n @HostBinding('style.text-align')\n get alignImageStyle() {\n return this.state.options.alignImage;\n }\n\n constructor(\n private sanitizer: DomSanitizer\n ) {\n this.reset();\n }\n\n ngOnInit(): void {\n this.state.stepSize = this.initialStepSize || this.state.stepSize;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const previousCropperPosition = this.state.cropper();\n const previousTransform = this.state.transform;\n const previousBackgroundColor = this.state.options.backgroundColor;\n\n this.state.setOptionsFromChanges(changes);\n this.onChangesInputImage(changes);\n\n if (changes['transform'] && this.transform) {\n this.state.transform = this.transform;\n this.setCssTransform();\n }\n\n if (!this.state.loadedImage?.transformed.image.complete || !this.state.maxSize) {\n return;\n }\n\n if ((this.containWithinAspectRatio && changes['aspectRatio']) || changes['containWithinAspectRatio'] || changes['canvasRotation']) {\n this.loadImageService\n .transformLoadedImage(this.state.loadedImage, this.state)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n return;\n }\n\n if (changes['cropper'] && this.cropper) {\n this.state.cropper.set(checkCropperPosition(this.cropper, this.state, true));\n }\n const cropperChanged = !this.state.equalsCropperPosition(previousCropperPosition);\n if (cropperChanged && (!this.cropper || !this.state.equalsCropperPosition(this.cropper))) {\n this.cropperChange.emit(this.state.cropper());\n }\n if (cropperChanged\n || !this.state.equalsTransform(previousTransform)\n || this.state.options.backgroundColor !== previousBackgroundColor) {\n this.doAutoCrop();\n }\n\n if (changes['hidden'] && this.resizedWhileHidden && !this.hidden) {\n setTimeout(() => {\n this.onResize();\n this.resizedWhileHidden = false;\n });\n }\n }\n\n private onChangesInputImage(changes: SimpleChanges): void {\n if (changes['imageChangedEvent'] || changes['imageURL'] || changes['imageBase64'] || changes['imageFile']) {\n this.reset();\n }\n if (changes['imageChangedEvent'] && this.isValidImageChangedEvent()) {\n this.loadImageFile(this.imageChangedEvent.target.files[0]);\n }\n if (changes['imageURL'] && this.imageURL) {\n this.loadImageFromURL(this.imageURL);\n }\n if (changes['imageBase64'] && this.imageBase64) {\n this.loadBase64Image(this.imageBase64);\n }\n if (changes['imageFile'] && this.imageFile) {\n this.loadImageFile(this.imageFile);\n }\n }\n\n private isValidImageChangedEvent(): this is {\n imageChangedEvent: Event & {\n target: { files: FileList };\n }\n } {\n const files = (this.imageChangedEvent as any)?.target?.files;\n return files instanceof FileList && files.length > 0;\n }\n\n private reset(): void {\n this.state.loadedImage = undefined;\n this.state.maxSize.set({ width: 0, height: 0 });\n this.imageVisible = false;\n }\n\n private loadImageFile(file: File): void {\n this.loadImageService\n .loadImageFile(file, this.state)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private loadBase64Image(imageBase64: string): void {\n this.loadImageService\n .loadBase64Image(imageBase64, this.state)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private loadImageFromURL(url: string): void {\n this.loadImageService\n .loadImageFromURL(url, this.state)\n .then((res) => this.setLoadedImage(res))\n .catch((err) => this.loadImageError(err));\n }\n\n private setLoadedImage(loadedImage: LoadedImage): void {\n this.state.loadedImage = loadedImage;\n this.safeImgDataUrl.set(this.sanitizer.bypassSecurityTrustResourceUrl(loadedImage.transformed.objectUrl));\n }\n\n loadImageError(error: unknown): void {\n console.error(error);\n this.loadImageFailed.emit();\n }\n\n private setCssTransform(): void {\n const translateUnit = this.state.transform?.translateUnit || '%';\n this.safeTransformStyle.set(this.sanitizer.bypassSecurityTrustStyle(\n `translate(${this.state.transform.translateH || 0}${translateUnit}, ${this.state.transform.translateV || 0}${translateUnit})` +\n ' scaleX(' + (this.state.transform.scale || 1) * (this.state.transform.flipH ? -1 : 1) + ')' +\n ' scaleY(' + (this.state.transform.scale || 1) * (this.state.transform.flipV ? -1 : 1) + ')' +\n ' rotate(' + (this.state.transform.rotate || 0) + 'deg)'\n ));\n }\n\n imageLoadedInView(): void {\n if (this.state.loadedImage != null) {\n this.imageLoaded.emit(this.state.loadedImage);\n this.setImageMaxSizeRetries = 0;\n setTimeout(() => this.checkImageMaxSizeRecursively());\n }\n }\n\n private checkImageMaxSizeRecursively(): void {\n if (this.setImageMaxSizeRetries > 40) {\n this.loadImageFailed.emit();\n } else if (this.sourceImageLoaded()) {\n this.setMaxSize();\n if (this.cropper && (!this.maintainAspectRatio || this.state.aspectRatioIsCorrect())) {\n this.state.cropper.set(checkCropperPosition(this.cropper, this.state, true));\n this.emitCropperPositionChange(this.cropper);\n } else {\n this.state.cropper.set(checkCropperPosition(this.state.maxSizeCropperPosition(), this.state, true));\n this.cropperChange.emit(this.state.cropper());\n }\n this.imageVisible = true;\n this.cropperReady.emit(this.state.maxSize());\n this.doAutoCrop();\n } else {\n this.setImageMaxSizeRetries++;\n setTimeout(() => this.checkImageMaxSizeRecursively(), 50);\n }\n }\n\n private sourceImageLoaded(): boolean {\n return this.sourceImage?.nativeElement?.offsetWidth > 1;\n }\n\n @HostListener('window:resize')\n onResize(): void {\n if (!this.state.loadedImage) {\n return;\n }\n if (this.hidden) {\n this.resizedWhileHidden = true;\n } else {\n const oldMaxSize = this.state.maxSize();\n this.setMaxSize();\n this.state.resizeCropperPosition(oldMaxSize);\n }\n }\n\n keyboardAccess(event: KeyboardEvent) {\n this.changeKeyboardStepSize(event);\n this.keyboardMoveCropper(event);\n }\n\n private changeKeyboardStepSize(event: KeyboardEvent): void {\n const key = +event.key;\n if (key >= 1 && key <= 9) {\n this.state.stepSize = key;\n }\n }\n\n private keyboardMoveCropper(event: KeyboardEvent) {\n const keyboardWhiteList: string[] = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft'];\n if (!(keyboardWhiteList.includes(event.key))) {\n return;\n }\n const moveType = event.shiftKey ? MoveTypes.Resize : MoveTypes.Move;\n const position = event.altKey ? getInvertedPositionForKey(event.key) : getPositionForKey(event.key);\n const moveEvent = getEventForKey(event.key, this.state.stepSize);\n event.preventDefault();\n event.stopPropagation();\n this.moveStart = {\n type: moveType,\n position,\n clientX: 0,\n clientY: 0,\n transform: this.state.transform,\n cropper: this.state.cropper()\n };\n this.handleMouseMove(moveEvent);\n this.handleMouseUp();\n }\n\n startMove(event: Event | BasicEvent, moveType: MoveTypes, position: Position | null = null): void {\n if (this.disabled\n || this.moveStart && this.moveStart.type === MoveTypes.Pinch\n || moveType === MoveTypes.Drag && !this.allowMoveImage) {\n return;\n }\n if ('preventDefault' in event) {\n event.preventDefault();\n }\n this.moveStart = {\n type: moveType,\n position,\n clientX: getClientX(event),\n clientY: getClientY(event),\n transform: this.state.transform,\n cropper: this.state.cropper()\n };\n this.initMouseMove();\n }\n\n private initMouseMove(): void {\n merge(\n fromEvent(document, 'mousemove'),\n fromEvent(document, 'touchmove')\n ).pipe(\n takeUntil(merge(\n fromEvent(document, 'mouseup'),\n fromEvent(document, 'touchend'),\n this.pinchStart$\n ).pipe(first()))\n ).subscribe({\n next: (event) => this.handleMouseMove(event),\n complete: () => this.handleMouseUp()\n });\n }\n\n private handleMouseMove(event: Event | BasicEvent): void {\n if (!this.moveStart) {\n return;\n }\n if ('stopPropagation' in event) {\n event.stopPropagation();\n }\n if ('preventDefault' in event) {\n event.preventDefault();\n }\n if (this.moveStart.type === MoveTypes.Move) {\n this.state.cropper.set(checkCropperWithinMaxSizeBounds(\n moveCropper(event, this.moveStart),\n this.state,\n true\n ));\n } else if (this.moveStart.type === MoveTypes.Resize) {\n if (!this.cropperStaticWidth && !this.cropperStaticHeight) {\n this.state.cropper.set(checkCropperWithinMaxSizeBounds(\n resizeCropper(event, this.moveStart, this.state),\n this.state,\n false\n ));\n }\n } else if (this.moveStart.type === MoveTypes.Drag) {\n const diffX = getClientX(event) - this.moveStart.clientX;\n const diffY = getClientY(event) - this.moveStart.clientY;\n this.state.transform = {\n ...this.state.transform,\n translateH: (this.moveStart.transform?.translateH || 0) + diffX,\n translateV: (this.moveStart.transform?.translateV || 0) + diffY\n };\n this.setCssTransform();\n }\n }\n\n private handleMouseUp(): void {\n if (!this.moveStart || this.moveStart.type === MoveTypes.Pinch) {\n return;\n }\n if (!this.state.equalsCropperPosition(this.moveStart.cropper)\n || this.moveStart.transform && !this.state.equalsTransform(this.moveStart.transform)) {\n if (this.moveStart.type === MoveTypes.Drag) {\n this.transformChange.emit(this.state.transform);\n } else {\n this.cropperChange.emit(this.state.cropper());\n }\n this.doAutoCrop();\n }\n this.moveStart = undefined;\n }\n\n startPinch(event: TouchEvent) {\n if (this.disabled || !this.sourceImageLoaded() || event.touches.length < 2) {\n return;\n }\n if ('preventDefault' in event) {\n event.preventDefault();\n }\n const cropper = this.state.cropper();\n this.moveStart = {\n type: MoveTypes.Pinch,\n position: 'center',\n clientX: cropper.x1 + (cropper.x2 - cropper.x1) / 2,\n clientY: cropper.y1 + (cropper.y2 - cropper.y1) / 2,\n cropper: cropper\n };\n this.initPinch();\n }\n\n private initPinch(): void {\n this.pinchStart$.next();\n fromEvent(document, 'touchmove')\n .pipe(takeUntil(fromEvent(document, 'touchend')))\n .subscribe({\n next: (event) => this.handlePinchMove(event as TouchEvent),\n complete: () => this.handlePinchStop()\n });\n }\n\n private handlePinchMove(event: TouchEvent) {\n if (!this.moveStart) {\n return;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n if (this.moveStart.type === MoveTypes.Pinch) {\n if (!this.cropperStaticWidth && !this.cropperStaticHeight) {\n this.state.cropper.set(checkCropperWithinMaxSizeBounds(\n resizeCropper(event, this.moveStart, this.state),\n this.state,\n false\n ));\n }\n }\n }\n\n private handlePinchStop(): void {\n if (!this.moveStart) {\n return;\n }\n if (!this.state.equalsCropperPosition(this.moveStart.cropper)) {\n this.emitCropperPositionChange(this.moveStart.cropper);\n this.doAutoCrop();\n }\n this.moveStart = undefined;\n }\n\n private setMaxSize(): void {\n if (this.sourceImage) {\n const sourceImageStyle = getComputedStyle(this.sourceImage.nativeElement);\n this.state.setMaxSize(parseFloat(sourceImageStyle.width), parseFloat(sourceImageStyle.height));\n this.marginLeft = this.sanitizer.bypassSecurityTrustStyle('calc(50% - ' + this.state.maxSize().width / 2 + 'px)');\n }\n }\n\n private emitCropperPositionChange(previousPosition: CropperPosition): void {\n if (!this.state.equalsCropperPosition(previousPosition)) {\n this.cropperChange.emit(this.state.cropper());\n }\n }\n\n private doAutoCrop(): void {\n if (this.state.options.autoCrop) {\n void this.crop();\n }\n }\n\n crop(): ImageCroppedEvent | null;\n crop(output: 'base64'): ImageCroppedEvent | null;\n crop(output: 'blob'): Promise<ImageCroppedEvent> | null;\n crop(output: OutputType = this.state.options.output): Promise<ImageCroppedEvent> | ImageCroppedEvent | null {\n if (this.state.loadedImage?.transformed?.image != null) {\n this.startCropImage.emit();\n if (output === 'blob') {\n return this.cropToBlob();\n } else if (output === 'base64') {\n return this.cropToBase64();\n }\n }\n return null;\n }\n\n private cropToBlob(): Promise<ImageCroppedEvent> | null {\n return new Promise(async (resolve, reject) => {\n const result = await this.cropService.crop(this.state.toCropInput(), 'blob');\n if (result) {\n this.imageCropped.emit(result);\n resolve(result);\n } else {\n reject('Crop image failed');\n }\n });\n }\n\n private cropToBase64(): ImageCroppedEvent | null {\n const result = this.cropService.crop(this.state.toCropInput(), 'base64');\n if (result) {\n this.imageCropped.emit(result);\n return result;\n }\n return null;\n }\n\n resetCropperPosition(): void {\n this.state.cropper.set(checkCropperPosition(this.state.maxSizeCropperPosition(), this.state, true));\n this.cropperChange.emit(this.state.cropper());\n }\n\n ngOnDestroy(): void {\n this.pinchStart$.complete();\n }\n}\n","<div\n [style.background]=\"imageVisible && state.options.backgroundColor\"\n (touchstart)=\"startPinch($event)\"\n>\n <img\n #sourceImage\n class=\"ngx-ic-source-image\"\n role=\"presentation\"\n *ngIf=\"safeImgDataUrl() as src\"\n [src]=\"src\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n [style.transform]=\"safeTransformStyle()\"\n [class.ngx-ic-draggable]=\"!disabled && allowMoveImage\"\n [attr.alt]=\"imageAltText\"\n (load)=\"imageLoadedInView()\"\n (mousedown)=\"startMove($event, moveTypes.Drag)\"\n (touchstart)=\"startMove($event, moveTypes.Drag)\"\n (error)=\"loadImageError($event)\"\n >\n <div\n class=\"ngx-ic-overlay\"\n [style.width.px]=\"state.maxSize().width || 0\"\n [style.height.px]=\"state.maxSize().height || 0\"\n [style.margin-left]=\"state.options.alignImage === 'center' ? marginLeft : null\"\n ></div>\n <div\n class=\"ngx-ic-cropper\"\n *ngIf=\"imageVisible\"\n [class.ngx-ic-round]=\"state.options.roundCropper\"\n [attr.aria-label]=\"state.options.cropperFrameAriaLabel\"\n [style.top.px]=\"state.cropper().y1\"\n [style.left.px]=\"state.cropper().x1\"\n [style.width.px]=\"state.cropper().x2 - state.cropper().x1\"\n [style.height.px]=\"state.cropper().y2 - state.cropper().y1\"\n [style.margin-left]=\"state.options.alignImage === 'center' ? marginLeft : null\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n (keydown)=\"keyboardAccess($event)\"\n tabindex=\"0\"\n >\n <div\n (mousedown)=\"startMove($event, moveTypes.Move)\"\n (touchstart)=\"startMove($event, moveTypes.Move)\"\n class=\"ngx-ic-move\"\n role=\"presentation\">\n </div>\n <ng-container\n *ngIf=\"!state.options.hideResizeSquares && !(state.options.cropperStaticWidth && state.options.cropperStaticHeight)\">\n <span\n class=\"ngx-ic-resize ngx-ic-topleft\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize ngx-ic-topright\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize ngx-ic-bottomright\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize ngx-ic-bottomleft\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize-bar ngx-ic-top\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\"\n ></span>\n\n <span\n class=\"ngx-ic-resize ngx-ic-top\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize-bar ngx-ic-right\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\"\n ></span>\n <span\n class=\"ngx-ic-resize ngx-ic-right\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize-bar ngx-ic-bottom\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n ></span>\n <span\n class=\"ngx-ic-resize ngx-ic-bottom\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span\n class=\"ngx-ic-resize-bar ngx-ic-left\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\"\n ></span>\n <span\n class=\"ngx-ic-resize ngx-ic-left\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\"\n >\n <span class=\"ngx-ic-square\"></span>\n </span>\n </ng-container>\n </div>\n</div>\n","export function base64ToFile(base64Image: string): Blob {\n const split = base64Image.split(',');\n const type = split[0].replace('data:', '').replace(';base64', '');\n const byteString = atob(split[1]);\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i += 1) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ab], {type});\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,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"}
|