UNPKG

ngx-pluto

Version:
180 lines 18.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, ViewChild, ElementRef, Input, Output, EventEmitter } from '@angular/core'; import Cropper from 'cropperjs'; /** * 图片剪裁组件 */ export class NpCropper { constructor() { this.cropperOptions = {}; this.export = new EventEmitter(); this.ready = new EventEmitter(); this.isLoading = true; } /** * @return {?} */ ngOnInit() { } /** * Image loaded * @param {?} ev * @return {?} */ imageLoaded(ev) { // Unset load error state this.loadError = false; // Setup image element /** @type {?} */ const image = (/** @type {?} */ (ev.target)); this.imageElement = image; // Add crossOrigin? if (this.cropperOptions.checkCrossOrigin) { image.crossOrigin = 'anonymous'; } // Image on ready event image.addEventListener('ready', (/** * @return {?} */ () => { // Emit ready this.ready.emit(true); // Unset loading state this.isLoading = false; // Validate cropbox existance if (this.cropbox) { // Set cropbox data this.cropper.setCropBoxData(this.cropbox); } })); // Set crop options // extend default with custom config this.cropperOptions = Object.assign({ checkCrossOrigin: true }, this.cropperOptions); // Set cropperjs if (this.cropper) { this.cropper.destroy(); this.cropper = undefined; } this.cropper = new Cropper(image, this.cropperOptions); } /** * Image load error * @param {?} event * @return {?} */ imageLoadError(event) { // Set load error state this.loadError = true; // Unset loading state this.isLoading = false; } /** * Export canvas * @param {?=} base64 * @param {?=} options * @return {?} */ exportCanvas(base64, options) { // Get and set image, crop and canvas data /** @type {?} */ const imageData = this.cropper.getImageData(); /** @type {?} */ const cropData = this.cropper.getCropBoxData(); /** @type {?} */ const canvas = this.cropper.getCroppedCanvas(options); /** @type {?} */ const data = { imageData, cropData, blob: null }; // Create promise to resolve canvas data /** @type {?} */ const promise = new Promise((/** * @param {?} resolve * @return {?} */ resolve => { // Validate base64 if (base64) { canvas.toBlob((/** * @param {?} blob * @return {?} */ blob => resolve({ blob, dataUrl: canvas.toDataURL('image/png') }))); } canvas.toBlob((/** * @param {?} blob * @return {?} */ blob => resolve({ blob }))); })); // Emit export data when promise is ready promise.then((/** * @param {?} res * @return {?} */ res => { this.export.emit(Object.assign(data, res)); })); } } NpCropper.decorators = [ { type: Component, args: [{ selector: `np-cropper`, template: "<!-- CROPPER WRAPPER -->\r\n<div class=\"cropper-wrapper\">\r\n\r\n <!-- LOADING -->\r\n <div class=\"loading-block\" *ngIf=\"isLoading\">\r\n <div class=\"spinner\"></div>\r\n </div>\r\n\r\n <!-- LOAD ERROR -->\r\n <div class=\"alert alert-warning\" *ngIf=\"loadError\">{{ loadImageErrorText }}</div>\r\n\r\n <!-- CROPPER -->\r\n <div class=\"cropper\">\r\n <img #image alt=\"image\" [src]=\"imageUrl\" (load)=\"imageLoaded($event)\" (error)=\"imageLoadError($event)\" />\r\n </div>\r\n</div>\r\n", encapsulation: ViewEncapsulation.None, styles: [":host{display:block}.cropper img{max-width:100%;max-height:100%;height:auto}.cropper-wrapper{position:relative;min-height:80px}.cropper-wrapper .loading-block{position:absolute;top:0;left:0;width:100%;height:100%}.cropper-wrapper .loading-block .spinner{width:31px;height:31px;margin:0 auto;border:2px solid rgba(97,100,193,.98);border-radius:50%;border-left-color:transparent;border-right-color:transparent;-webkit-animation:425ms linear infinite cssload-spin;position:absolute;top:calc(50% - 15px);left:calc(50% - 15px);animation:425ms linear infinite cssload-spin}@-webkit-keyframes cssload-spin{to{transform:rotate(360deg)}}@keyframes cssload-spin{to{transform:rotate(360deg)}}/*!\r\n * Cropper.js v1.5.7\r\n * https://fengyuanchen.github.io/cropperjs\r\n *\r\n * Copyright 2015-present Chen Fengyuan\r\n * Released under the MIT license\r\n *\r\n * Date: 2020-05-23T05:22:57.283Z\r\n */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:rgba(51,153,255,.75) solid 1px;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:calc(100% / 3);left:0;top:calc(100% / 3);width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:calc(100% / 3);top:0;width:calc(100% / 3)}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center::after,.cropper-center::before{background-color:#eee;content:' ';display:block;position:absolute}.cropper-center::before{height:1px;left:-3px;top:0;width:7px}.cropper-center::after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se::before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}"] }] } ]; /** @nocollapse */ NpCropper.ctorParameters = () => []; NpCropper.propDecorators = { image: [{ type: ViewChild, args: ['image',] }], imageUrl: [{ type: Input }], cropbox: [{ type: Input }], loadImageErrorText: [{ type: Input }], cropperOptions: [{ type: Input }], export: [{ type: Output }], ready: [{ type: Output }] }; if (false) { /** @type {?} */ NpCropper.prototype.image; /** @type {?} */ NpCropper.prototype.imageUrl; /** @type {?} */ NpCropper.prototype.cropbox; /** @type {?} */ NpCropper.prototype.loadImageErrorText; /** @type {?} */ NpCropper.prototype.cropperOptions; /** @type {?} */ NpCropper.prototype.export; /** @type {?} */ NpCropper.prototype.ready; /** @type {?} */ NpCropper.prototype.isLoading; /** @type {?} */ NpCropper.prototype.cropper; /** @type {?} */ NpCropper.prototype.imageElement; /** @type {?} */ NpCropper.prototype.loadError; } /** * @record */ export function ImageCropperResult() { } if (false) { /** @type {?} */ ImageCropperResult.prototype.imageData; /** @type {?} */ ImageCropperResult.prototype.cropData; /** @type {?} */ ImageCropperResult.prototype.blob; /** @type {?|undefined} */ ImageCropperResult.prototype.dataUrl; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1wbHV0by8iLCJzb3VyY2VzIjpbImxpYi9jcm9wcGVyL2Nyb3BwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLE9BQU8sTUFBTSxXQUFXLENBQUM7Ozs7QUFZaEMsTUFBTSxPQUFPLFNBQVM7SUFnQnBCO1FBVlMsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBRXBDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUNoRCxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU5QixjQUFTLEdBQVksSUFBSSxDQUFDO0lBS2pCLENBQUM7Ozs7SUFFakIsUUFBUTtJQUNSLENBQUM7Ozs7OztJQU1ELFdBQVcsQ0FBQyxFQUFTO1FBQ25CLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs7O2NBRWpCLEtBQUssR0FBRyxtQkFBQSxFQUFFLENBQUMsTUFBTSxFQUFvQjtRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixtQkFBbUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFO1lBQ3hDLEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1NBQ2pDO1FBRUQsdUJBQXVCO1FBQ3ZCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPOzs7UUFBRSxHQUFHLEVBQUU7WUFDbkMsYUFBYTtZQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2Qiw2QkFBNkI7WUFDN0IsSUFB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Q29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgQ3JvcHBlciBmcm9tICdjcm9wcGVyanMnO1xyXG5cclxuLyoqXHJcbiAqIOWbvueJh+WJquijgee7hOS7tlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IGBucC1jcm9wcGVyYCxcclxuICB0ZW1wbGF0ZVVybDogJ2Nyb3BwZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2Nyb3BwZXIuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOcENyb3BwZXIgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlJykgaW1hZ2U6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGltYWdlVXJsOiBhbnk7XHJcbiAgQElucHV0KCkgY3JvcGJveDogQ3JvcHBlci5Dcm9wQm94RGF0YTtcclxuICBASW5wdXQoKSBsb2FkSW1hZ2VFcnJvclRleHQ6IHN0cmluZztcclxuICBASW5wdXQoKSBjcm9wcGVyT3B0aW9uczogQ3JvcHBlci5PcHRpb25zID0ge307XHJcblxyXG4gIEBPdXRwdXQoKSBleHBvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlQ3JvcHBlclJlc3VsdD4oKTtcclxuICBAT3V0cHV0KCkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBjcm9wcGVyOiBDcm9wcGVyO1xyXG4gIHB1YmxpYyBpbWFnZUVsZW1lbnQ6IEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgcHVibGljIGxvYWRFcnJvcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogSW1hZ2UgbG9hZGVkXHJcbiAgICAgKiBAcGFyYW0gZXZcclxuICAgICAqL1xyXG4gIGltYWdlTG9hZGVkKGV2OiBFdmVudCkge1xyXG4gICAgLy8gVW5zZXQgbG9hZCBlcnJvciBzdGF0ZVxyXG4gICAgdGhpcy5sb2FkRXJyb3IgPSBmYWxzZTtcclxuICAgIC8vIFNldHVwIGltYWdlIGVsZW1lbnRcclxuICAgIGNvbnN0IGltYWdlID0gZXYudGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmltYWdlRWxlbWVudCA9IGltYWdlO1xyXG4gICAgLy8gQWRkIGNyb3NzT3JpZ2luP1xyXG4gICAgaWYgKHRoaXMuY3JvcHBlck9wdGlvbnMuY2hlY2tDcm9zc09yaWdpbikge1xyXG4gICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEltYWdlIG9uIHJlYWR5IGV2ZW50XHJcbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdyZWFkeScsICgpID0+IHtcclxuICAgICAgLy8gRW1pdCByZWFkeVxyXG4gICAgICB0aGlzLnJlYWR5LmVtaXQodHJ1ZSk7XHJcbiAgICAgIC8vIFVuc2V0IGxvYWRpbmcgc3RhdGVcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgLy8gVmFsaWRhdGUgY3JvcGJveCBleGlzdGFuY2VcclxuICAgICAgaWYgKHRoaXMuY3JvcGJveCkge1xyXG4gICAgICAgIC8vIFNldCBjcm9wYm94IGRhdGFcclxuICAgICAgICB0aGlzLmNyb3BwZXIuc2V0Q3JvcEJveERhdGEodGhpcy5jcm9wYm94KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU2V0IGNyb3Agb3B0aW9uc1xyXG4gICAgLy8gZXh0ZW5kIGRlZmF1bHQgd2l0aCBjdXN0b20gY29uZmlnXHJcbiAgICB0aGlzLmNyb3BwZXJPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgIGNoZWNrQ3Jvc3NPcmlnaW46IHRydWVcclxuICAgIH0sIHRoaXMuY3JvcHBlck9wdGlvbnMpO1xyXG5cclxuICAgIC8vIFNldCBjcm9wcGVyanNcclxuICAgIGlmICh0aGlzLmNyb3BwZXIpIHtcclxuICAgICAgdGhpcy5jcm9wcGVyLmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5jcm9wcGVyID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jcm9wcGVyID0gbmV3IENyb3BwZXIoaW1hZ2UsIHRoaXMuY3JvcHBlck9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1hZ2UgbG9hZCBlcnJvclxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIGltYWdlTG9hZEVycm9yKGV2ZW50OiBhbnkpIHtcclxuICAgIC8vIFNldCBsb2FkIGVycm9yIHN0YXRlXHJcbiAgICB0aGlzLmxvYWRFcnJvciA9IHRydWU7XHJcbiAgICAvLyBVbnNldCBsb2FkaW5nIHN0YXRlXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwb3J0IGNhbnZhc1xyXG4gICAqIEBwYXJhbSBiYXNlNjRcclxuICAgKi9cclxuICBleHBvcnRDYW52YXMoYmFzZTY0PzogYm9vbGVhbiwgb3B0aW9ucz86IENyb3BwZXIuR2V0Q3JvcHBlZENhbnZhc09wdGlvbnMpIHtcclxuICAgIC8vIEdldCBhbmQgc2V0IGltYWdlLCBjcm9wIGFuZCBjYW52YXMgZGF0YVxyXG4gICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5jcm9wcGVyLmdldEltYWdlRGF0YSgpO1xyXG4gICAgY29uc3QgY3JvcERhdGEgPSB0aGlzLmNyb3BwZXIuZ2V0Q3JvcEJveERhdGEoKTtcclxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKG9wdGlvbnMpO1xyXG4gICAgY29uc3QgZGF0YSA9IHsgaW1hZ2VEYXRhLCBjcm9wRGF0YSwgYmxvYjogbnVsbCB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBwcm9taXNlIHRvIHJlc29sdmUgY2FudmFzIGRhdGFcclxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgLy8gVmFsaWRhdGUgYmFzZTY0XHJcbiAgICAgIGlmIChiYXNlNjQpIHtcclxuICAgICAgICBjYW52YXMudG9CbG9iKGJsb2IgPT4gcmVzb2x2ZSh7IGJsb2IsIGRhdGFVcmw6IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpIH0pKTtcclxuICAgICAgfVxyXG4gICAgICBjYW52YXMudG9CbG9iKGJsb2IgPT4gcmVzb2x2ZSh7IGJsb2IgfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRW1pdCBleHBvcnQgZGF0YSB3aGVuIHByb21pc2UgaXMgcmVhZHlcclxuICAgIHByb21pc2UudGhlbihyZXMgPT4ge1xyXG4gICAgICB0aGlzLmV4cG9ydC5lbWl0KE9iamVjdC5hc3NpZ24oZGF0YSwgcmVzKSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VDcm9wcGVyUmVzdWx0IHtcclxuICBpbWFnZURhdGE6IENyb3BwZXIuSW1hZ2VEYXRhO1xyXG4gIGNyb3BEYXRhOiBDcm9wcGVyLkNyb3BCb3hEYXRhO1xyXG4gIGJsb2I6IEJsb2I7XHJcbiAgZGF0YVVybD86IHN0cmluZztcclxufVxyXG5cclxuIl19