{"version":3,"file":"ngx-image-compress.mjs","sources":["../../../projects/ngx-image-compress/src/lib/models/DOC_ORIENTATION.ts","../../../projects/ngx-image-compress/src/lib/image-compress.ts","../../../projects/ngx-image-compress/src/lib/ngx-image-compress.service.ts","../../../projects/ngx-image-compress/src/lib/ngx-image-capture.component.ts","../../../projects/ngx-image-compress/src/lib/ngx-image-capture.module.ts","../../../projects/ngx-image-compress/src/public-api.ts","../../../projects/ngx-image-compress/src/ngx-image-compress.ts"],"sourcesContent":["/**\n * EXIF tag standard reference\n *\n * Tag Name: Orientation\n * Tag ID: 0x0112\n * Writable: int16u\n * Group: IFD0\n * Values:\n 1 = Horizontal (normal)\n 2 = Mirror horizontal\n 3 = Rotate 180\n 4 = Mirror vertical\n 5 = Mirror horizontal and rotate 270 CW\n 6 = Rotate 90 CW\n 7 = Mirror horizontal and rotate 90 CW\n 8 = Rotate 270 CW\n */\nexport enum DOC_ORIENTATION {\n    Up = 1, //Horizontal (normal)\n    Down = 3, //Rotate 180\n    Right = 6, //Rotate 90 CW\n    Left = 8, //Rotate 270 CW\n    UpMirrored = 2, //Mirror horizontal\n    DownMirrored = 4, //Mirror vertical\n    LeftMirrored = 5, //Mirror horizontal and rotate 270 CW\n    RightMirrored = 7, //Mirror horizontal and rotate 90 CW\n    Default = 0,\n    NotJpeg = -1,\n    NotDefined = -2,\n}\n","import {Renderer2} from '@angular/core';\nimport {DataUrl} from './models/data-url';\nimport {DOC_ORIENTATION} from './models/DOC_ORIENTATION';\nimport {UploadResponse} from './models/upload-response';\n\nexport class ImageCompress {\n    getOrientation(file: File): Promise<DOC_ORIENTATION> {\n        return new Promise<DOC_ORIENTATION>((resolve, reject) => {\n            try {\n                const reader = new FileReader();\n                reader.onload = () => {\n                    const view = new DataView(reader.result as ArrayBuffer);\n                    if (!view.byteLength) {\n                        return resolve(DOC_ORIENTATION.NotDefined);\n                    }\n                    if (view.getUint16(0, false) !== 0xffd8) {\n                        return resolve(DOC_ORIENTATION.NotDefined);\n                    }\n                    const length = view.byteLength;\n                    let offset = 2;\n                    while (offset < length) {\n                        const marker = view.getUint16(offset, false);\n                        offset += 2;\n                        if (marker === 0xffe1) {\n                            if (view.getUint32((offset += 2), false) !== 0x45786966) {\n                                return resolve(DOC_ORIENTATION.NotJpeg);\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 resolve(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 resolve(DOC_ORIENTATION.NotJpeg);\n                };\n                reader.readAsArrayBuffer(file);\n            } catch (e) {\n                return reject(DOC_ORIENTATION.Default);\n            }\n        });\n    }\n\n    uploadFile(render: Renderer2, multiple = true, rejectOnCancel = false): Promise<UploadResponse | UploadResponse[]> {\n        return new Promise((resolve, reject) => {\n            const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n            const isIOS = /iPad|iPhone|iPod/i.test(navigator.userAgent);\n\n            Promise.resolve(isSafari || isIOS)\n                .then(onlyNative => {\n                    if (onlyNative) {\n                        return this.generateUploadInputNative(window.document, multiple, rejectOnCancel);\n                    } else {\n                        return this.generateUploadInputRenderer(render, multiple, rejectOnCancel);\n                    }\n                })\n                .then((filesList: FileList | null) => {\n                    const files = filesList ? Array.from(filesList) : [];\n                    const orientationPromises = files.map(file => this.getOrientation(file));\n                    const readerPromises = files.map(file => this.fileToDataURL(file));\n\n                    let orientationsResult: DOC_ORIENTATION[] = [];\n\n                    Promise.all(orientationPromises)\n                        .then((orientations: DOC_ORIENTATION[]) => {\n                            orientationsResult = orientations;\n                            return Promise.all(readerPromises);\n                        })\n                        .then(readerResult => {\n                            const resultArray = readerResult.map((parsedFile, index) => ({\n                                image: parsedFile.dataUrl,\n                                orientation: orientationsResult[index],\n                                fileName: parsedFile.fileName,\n                            }));\n\n                            if (multiple) {\n                                resolve(resultArray);\n                            } else {\n                                resolve(resultArray[0]);\n                            }\n                        });\n                })\n                .catch(err => reject(err));\n        });\n    }\n\n    fileToDataURL(file: File): Promise<{dataUrl: string; fileName: string}> {\n        return new Promise<{dataUrl: string; fileName: string}>((resolve, reject) => {\n            const reader = new FileReader();\n            reader.onload = (e: any) => {\n                //myReader.onloadend = (progressEvent: ProgressEvent<FileReader>)\n                resolve({dataUrl: e.target.result, fileName: file.name});\n            };\n            try {\n                reader.readAsDataURL(file);\n            } catch (e) {\n                reject(`ngx-image-compress - probably no file have been selected: ${e}`);\n            }\n        });\n    }\n\n    generateUploadInputRenderer(render: Renderer2, multiple = true, rejectOnCancel = false) {\n        let lock = false;\n        return new Promise<FileList | null>((resolve, reject) => {\n            const inputElement = render.createElement('input');\n            render.setStyle(inputElement, 'display', 'none');\n            render.setProperty(inputElement, 'type', 'file');\n            render.setProperty(inputElement, 'accept', 'image/*, .heic');\n\n            if (multiple) {\n                render.setProperty(inputElement, 'multiple', 'true');\n            }\n\n            render.listen(inputElement, 'click', ($event: MouseEvent) => {\n                ($event.target as any as HTMLInputElement).value = '';\n            });\n\n            render.listen(inputElement, 'change', $event => {\n                lock = true;\n                const files: FileList = $event.target.files;\n                resolve(files);\n            });\n\n            if (rejectOnCancel) {\n                window.addEventListener(\n                    'focus',\n                    () => {\n                        setTimeout(() => {\n                            if (!lock) {\n                                reject(new Error('file upload on blur - no file selected'));\n                            }\n                        }, 300);\n                    },\n                    {once: true}\n                );\n            }\n\n            inputElement.click();\n        });\n    }\n\n    generateUploadInputNative(documentNativeApi: any, multiple = true, rejectOnCancel = false) {\n        let lock = false;\n        return new Promise<FileList | null>((resolve, reject) => {\n            const inputElement = documentNativeApi.createElement('input');\n            inputElement.id = 'upload-input' + new Date();\n            inputElement.style.display = 'none';\n            inputElement.setAttribute('type', 'file');\n            inputElement.setAttribute('accept', 'image/*, .heic');\n\n            if (multiple) {\n                inputElement.setAttribute('multiple', 'true');\n            }\n\n            documentNativeApi.body.appendChild(inputElement);\n\n            inputElement.addEventListener(\n                'change',\n                () => {\n                    lock = true;\n                    resolve(inputElement.files);\n                    documentNativeApi.body.removeChild(documentNativeApi.getElementById(inputElement.id) as Node);\n                },\n                {once: true}\n            );\n\n            if (rejectOnCancel) {\n                window.addEventListener(\n                    'focus',\n                    () => {\n                        setTimeout(() => {\n                            if (!lock && documentNativeApi.getElementById(inputElement.id)) {\n                                reject(new Error('file upload on blur - no file selected'));\n                                documentNativeApi.body.removeChild(documentNativeApi.getElementById(inputElement.id) as Node);\n                            }\n                        }, 300);\n                    },\n                    {once: true}\n                );\n            }\n\n            // open file select box\n            inputElement.click();\n        });\n    }\n\n    compress(\n        imageDataUrlSource: DataUrl,\n        orientation: DOC_ORIENTATION,\n        render: Renderer2,\n        ratio = 50,\n        quality = 50,\n        maxwidth = 0,\n        maxheight = 0\n    ): Promise<string> {\n        return new Promise(function (resolve, reject) {\n            quality = quality / 100;\n            ratio = ratio / 100;\n            const sourceImage = new Image();\n\n            // important for safari: we need to wait for onload event\n            sourceImage.onload = () => {\n                const canvas: HTMLCanvasElement = render.createElement('canvas');\n                const ctx: CanvasRenderingContext2D | null = canvas.getContext('2d');\n\n                if (!ctx) {\n                    return reject(`No canvas context available`);\n                }\n\n                let w = sourceImage.naturalWidth;\n                let h = sourceImage.naturalHeight;\n\n                if (!CSS.supports('image-orientation', 'from-image')) {\n                    if (orientation === DOC_ORIENTATION.Right || orientation === DOC_ORIENTATION.Left) {\n                        const t = w;\n                        w = h;\n                        h = t;\n                    }\n                }\n\n                const xratio = maxwidth ? maxwidth / w : 1;\n                const yratio = maxheight ? maxheight / h : 1;\n                ratio = Math.min(ratio, xratio, yratio);\n                canvas.width = w * ratio;\n                canvas.height = h * ratio;\n\n                const TO_RADIANS = Math.PI / 180;\n\n                if (CSS.supports('image-orientation', 'from-image') || orientation === DOC_ORIENTATION.Up) {\n                    ctx.drawImage(sourceImage, 0, 0, canvas.width, canvas.height);\n                } else if (orientation === DOC_ORIENTATION.Right) {\n                    ctx.save();\n                    ctx.rotate(90 * TO_RADIANS);\n                    ctx.translate(0, -canvas.width);\n                    ctx.drawImage(sourceImage, 0, 0, canvas.height, canvas.width);\n                    ctx.restore();\n                } else if (orientation === DOC_ORIENTATION.Left) {\n                    ctx.save();\n                    ctx.rotate(-90 * TO_RADIANS);\n                    ctx.translate(-canvas.width, 0);\n                    ctx.drawImage(sourceImage, 0, 0, canvas.height, canvas.width);\n                    ctx.restore();\n                } else if (orientation === DOC_ORIENTATION.Down) {\n                    ctx.save();\n                    ctx.rotate(180 * TO_RADIANS);\n                    ctx.translate(-canvas.width, -canvas.height);\n                    ctx.drawImage(sourceImage, 0, 0, canvas.width, canvas.height);\n                    ctx.restore();\n                } else {\n                    // no orientation value found - same as default UP\n                    ctx.drawImage(sourceImage, 0, 0, canvas.width, canvas.height);\n                }\n\n                const mime = imageDataUrlSource.substr(5, imageDataUrlSource.split(';')[0].length - 5);\n                // TODO test on mime\n                const result = canvas.toDataURL(mime, quality);\n\n                resolve(result);\n            };\n\n            sourceImage.onerror = e => reject(e);\n            sourceImage.src = imageDataUrlSource;\n        });\n    }\n\n    byteCount = (imgString: DataUrl): number => encodeURI(imgString).split(/%..|./).length - 1;\n\n    async uploadGetImageMaxSize(maxSizeMb: number, debugMode: boolean, render: Renderer2, rejectOnCancel = false): Promise<UploadResponse> {\n        if (debugMode) {\n            console.debug('Ngxthis - Opening upload window');\n        }\n\n        const myFile: UploadResponse = (await this.uploadFile(render, false, rejectOnCancel)) as UploadResponse;\n\n        return await this.getImageMaxSize(myFile, maxSizeMb, debugMode, render);\n    }\n\n    async getImageMaxSize(myFile: UploadResponse, maxSizeMb: number, debugMode: boolean, render: Renderer2): Promise<UploadResponse> {\n        const MAX_TRIES = 10;\n\n        const bytesToMB = (bytes: number) => (bytes / 1024 / 1024).toFixed(2);\n\n        if (debugMode) {\n            console.debug('Ngxthis - Opening upload window');\n        }\n\n        let compressedFile;\n\n        for (let i = 0; i < MAX_TRIES; i++) {\n            const previousSize = this.byteCount(myFile.image);\n            compressedFile = await this.compress(myFile.image, myFile.orientation, render, 50, 100);\n            const newSize = this.byteCount(compressedFile);\n            console.debug('Ngxthis -', 'Compression from', bytesToMB(previousSize), 'MB to', bytesToMB(newSize), 'MB');\n            if (newSize >= previousSize) {\n                if (i === 0) {\n                    if (debugMode) {\n                        console.debug(\n                            'Ngxthis -',\n                            \"File can't be reduced at all - returning the original\",\n                            bytesToMB(previousSize),\n                            'MB large'\n                        );\n                    }\n                    throw {...myFile, image: compressedFile};\n                } else {\n                    if (debugMode) {\n                        console.debug(\n                            'Ngxthis -',\n                            \"File can't be reduced more - returning the best we can, which is \",\n                            bytesToMB(previousSize),\n                            'MB large'\n                        );\n                    }\n                    throw {...myFile, image: compressedFile};\n                }\n            } else {\n                if (newSize < maxSizeMb * 1024 * 1024) {\n                    if (debugMode) {\n                        console.debug('Ngxthis -', 'Here your file', bytesToMB(newSize), 'MB large');\n                    }\n                    return {...myFile, image: compressedFile};\n                } else if (i === 9) {\n                    if (debugMode) {\n                        console.debug(\n                            'Ngxthis -',\n                            \"File can't reach the desired size after\",\n                            MAX_TRIES,\n                            'tries. Returning file ',\n                            bytesToMB(previousSize),\n                            'MB large'\n                        );\n                    }\n                    throw {...myFile, image: compressedFile};\n                }\n            }\n            if (debugMode) {\n                console.debug('Ngxthis -', 'Reached', bytesToMB(newSize), 'MB large. Trying another time after', i + 1, 'times');\n            }\n            myFile.image = compressedFile;\n        }\n        if (debugMode) {\n            console.debug('Ngxthis - Unexpected error');\n        }\n        throw {};\n    }\n}\n","import {Injectable, Renderer2, RendererFactory2} from '@angular/core';\nimport {ImageCompress} from './image-compress';\nimport {DataUrl} from './models/data-url';\nimport {DOC_ORIENTATION} from './models/DOC_ORIENTATION';\nimport {UploadResponse} from './models/upload-response';\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class NgxImageCompressService {\n    private readonly render: Renderer2;\n\n    private imageCompress: ImageCompress;\n\n    public DOC_ORIENTATION = DOC_ORIENTATION;\n\n    constructor(rendererFactory: RendererFactory2) {\n        this.render = rendererFactory.createRenderer(null, null);\n        this.imageCompress = new ImageCompress();\n    }\n\n    /**\n     * helper to evaluate the compression rate\n     * @param imgString the image in base64 string format\n     */\n    public byteCount(image: DataUrl) {\n        return this.imageCompress.byteCount(image);\n    }\n\n    /**\n     * Get the correct Orientation value from image tags\n     */\n    public getOrientation(file: File): Promise<DOC_ORIENTATION> {\n        return this.imageCompress.getOrientation(file);\n    }\n\n    /**\n     * return a promise with the new image data and image orientation\n     * Nothing happen if no file have been selected\n     */\n    public uploadFile(): Promise<UploadResponse> {\n        return this.imageCompress.uploadFile(this.render, false) as Promise<UploadResponse>;\n    }\n\n    /**\n     * return a promise with an array of image data and image orientation\n     * Nothing happen if no files have been selected\n     */\n    public uploadMultipleFiles(): Promise<UploadResponse[]> {\n        return this.imageCompress.uploadFile(this.render, true) as Promise<UploadResponse[]>;\n    }\n\n    /**\n     * return a promise with the new image data and image orientation\n     * the promise will reject if no file have been selected\n     */\n    public uploadFileOrReject(): Promise<UploadResponse> {\n        return this.imageCompress.uploadFile(this.render, false, true) as Promise<UploadResponse>;\n    }\n\n    /**\n     * return a promise with an array of image data and image orientation\n     * the promise will reject if no files have been selected\n     */\n    public uploadMultipleFilesOrReject(): Promise<UploadResponse[]> {\n        return this.imageCompress.uploadFile(this.render, true, true) as Promise<UploadResponse[]>;\n    }\n\n    /**\n   * perform a compression from the given DataUrl (string), provided by the uploadFile, or uploadMultipleFiles method\n   *\n   *\n   | Parameter   | Type   | Description                                                                       |\n   | ----------- | ------ | --------------------------------------------------------------------------------- |\n   | image       | string | DataUrl (string) representing the image                                           |\n   | orientation | number | EXIF Orientation value using the DOC_ORIENTATION enum value                       |\n   | ratio       | number | Maximum scale factor as a percentage (optional, default: 50) <sup>[1](#fn1)</sup> |\n   | quality     | number | JPEG quality factor as a percentage (optional, default: 50) <sup>[2](#fn2)</sup>  |\n   | maxwidth    | number | Maximum width in pixels if you need to resize (optional, default: 0 - no resize)  |\n   | maxheight   | number | Maximum height in pixels if you need to resize (optional, default: 0 - no resize) |\n   */\n    public compressFile(\n        image: DataUrl,\n        orientation: DOC_ORIENTATION,\n        ratio = 50,\n        quality = 50,\n        maxWidth = 0,\n        maxHeight = 0\n    ): Promise<DataUrl> {\n        return this.imageCompress.compress(image, orientation, this.render, ratio, quality, maxWidth, maxHeight);\n    }\n\n    /**\n     * Most simple function to use here.\n     * Perform an upload and return an image dataUrl (string format) with a maximum size, given in *MegaBytes*\n     * If the size can't be reached, the best that can be reached will be returned in promise *rejection*\n     * Put debugMode to true if you have some trouble to print some help using console.debug\n     */\n    public uploadAndGetImageWithMaxSize(maxSizeMb = 1, debugMode = false, rejectOnCancel = false): Promise<DataUrl> {\n        return this.imageCompress\n            .uploadGetImageMaxSize(maxSizeMb, debugMode, this.render, rejectOnCancel)\n            .then(uploadResponse => uploadResponse.image)\n            .catch(e => {\n                throw e.image;\n            });\n    }\n\n    /**\n     * Same as before, but return more informations (file name...)\n     */\n    public uploadAndGetImageWithMaxSizeAndMetas(maxSizeMb = 1, debugMode = false, rejectOnCancel = false): Promise<UploadResponse> {\n        return this.imageCompress.uploadGetImageMaxSize(maxSizeMb, debugMode, this.render, rejectOnCancel);\n    }\n\n    /**\n     * Not handling the upload, you need to provide the file and the orientation by yourself\n     */\n    public getImageWithMaxSizeAndMetas(file: UploadResponse, maxSizeMb = 1, debugMode = false): Promise<UploadResponse> {\n        return this.imageCompress.getImageMaxSize(file, maxSizeMb, debugMode, this.render);\n    }\n}\n","import {Component, ElementRef, EventEmitter, Output, ViewChild} from '@angular/core';\nimport {DataUrl} from './models/data-url';\n\n@Component({\n    selector: 'ngx-image-capture',\n    template: `\n        <span (click)=\"startVideoCapture()\" *ngIf=\"!streamOpened\">\n            <ng-content select=\"[openStreamBtn]\"></ng-content>\n        </span>\n        <span (click)=\"acquireImage()\" *ngIf=\"streamOpened\">\n            <ng-content select=\"[acquireImageBtn]\"></ng-content>\n        </span>\n        <video #video autoplay *ngIf=\"streamOpened\"></video>\n    `,\n    styles: [],\n})\nexport class NgxImageCaptureComponent {\n    @Output() imageCaptured = new EventEmitter<DataUrl>();\n    @Output() errorCapture = new EventEmitter<string>();\n\n    @ViewChild('video', {static: false})\n    videoElement: ElementRef<HTMLVideoElement> | null = null;\n    videoStream: MediaStream | null = ViewChild('video', {static: false});\n    streamOpened = false;\n\n    startVideoCapture() {\n        this.streamOpened = true;\n\n        const constraints = {\n            audio: false,\n            video: {\n                width: {ideal: 1920},\n                height: {ideal: 1080},\n                facingMode: {ideal: 'user'},\n            },\n        };\n\n        navigator.mediaDevices\n            .getUserMedia(constraints)\n            .then(stream => {\n                this.videoStream = stream;\n                setTimeout(() => {\n                    if (this.videoElement && this.videoElement.nativeElement) {\n                        this.videoElement.nativeElement.srcObject = stream;\n                    }\n                }, 100);\n            })\n            .catch(error => {\n                this.errorCapture.emit(`Ngx Image Compress: Could not access the camera. ${error}`);\n                this.streamOpened = true;\n            });\n    }\n\n    acquireImage(): void {\n        const canvas = document.createElement('canvas');\n        const video = this.videoElement && this.videoElement.nativeElement;\n        if (!video) {\n            this.errorCapture.emit('Ngx Image Compress - Error in acquisition of video element.');\n            this.streamOpened = false;\n            return;\n        }\n        canvas.width = video.videoWidth;\n        canvas.height = video.videoHeight;\n        const context2d = canvas.getContext('2d');\n        if (context2d) context2d.drawImage(video, 0, 0);\n        const newImage = canvas.toDataURL('jpg', 95);\n        if (this.videoStream) {\n            this.videoStream.getVideoTracks().forEach(track => track.stop());\n        }\n        this.imageCaptured.emit(newImage);\n        this.streamOpened = false;\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {NgxImageCaptureComponent} from './ngx-image-capture.component';\nimport {CommonModule} from '@angular/common';\n\n@NgModule({\n    declarations: [NgxImageCaptureComponent],\n    imports: [CommonModule],\n    exports: [NgxImageCaptureComponent],\n})\nexport class NgxImageCaptureModule {}\n","/*\n * Public API Surface of ngx-image-compress\n */\n\nexport * from './lib/ngx-image-compress.service';\nexport * from './lib/ngx-image-capture.component';\nexport * from './lib/ngx-image-capture.module';\nexport * from './lib/models/DOC_ORIENTATION';\nexport * from './lib/models/upload-response';\nexport * from './lib/models/data-url';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}