UNPKG

cropo

Version:

Cropo is a fast, lightweight image cropping tools for JavaScript. Resize and crop your uploaded image using a intuitive user interface.

1 lines 22.8 kB
{"version":3,"sources":["../script.ts"],"sourcesContent":["export class Cropo {\n // zoom range input\n private slider: HTMLInputElement | undefined;\n\n // canvas related variables\n private canvas!: HTMLCanvasElement;\n private canvasContext!: CanvasRenderingContext2D;\n private canvasWidth: number = 0;\n private canvasHeight: number = 0;\n\n // image related variables\n private fit: boolean = true;\n private img!: HTMLImageElement;\n private imgHeight!: number;\n private imgWidth!: number;\n private scale!: number;\n private baseScale: number = 1;\n private maxScale: number = 5;\n private minScale: number = 1;\n private originalWidth!: number;\n private originalHeight!: number;\n private ratio!: number;\n\n // Pointer drag related variables\n private isDown!: boolean;\n private pointerX!: number\n private pointerY!: number;\n\n // the accumulated horizontal(X) & vertical(Y) panning the user has done in total\n private netPanningX!: number;\n private netPanningY!: number;\n\n // zoom and pinch related variables\n private originX!: number\n private originY!: number;\n private eventCache!: PointerEvent[];\n private prevDiff!: number;\n\n // TODO: remove optional from version 1.0.0\n constructor (options: {\n imageUrl?: string;\n onImageLoad?: () => void;\n canvas?: HTMLCanvasElement,\n rangeInput?: HTMLInputElement,\n height?: number,\n width?: number,\n x?: number,\n y?: number,\n fit?: boolean,\n baseScale?: number;\n maxScale?: number;\n minScale?: number;\n }) {\n this.baseScale = options?.baseScale || this.baseScale\n this.maxScale = options?.maxScale || this.maxScale\n this.minScale = options?.minScale || this.minScale\n this.loadCanvas(options?.canvas || document.createElement('canvas'), options?.width, options?.height)\n if (options?.rangeInput) this.loadSlider(options.rangeInput)\n if (options?.imageUrl) {\n this.loadImageFromUrl(options?.imageUrl, options?.fit, () => {\n this.move(options?.x || 0, options?.y || 0)\n options?.onImageLoad?.()\n })\n }\n }\n\n // define function to clamp number\n private clamp (num: number, from: number, to: number) {\n return Math.max(from, Math.min(num, to))\n }\n\n // define debounce function\n private debounce<Params extends any[]> (func: (...args: Params) => any, timeout: number): (...args: Params) => void {\n let timer: ReturnType<typeof setTimeout>\n return (...args: Params) => {\n clearTimeout(timer)\n timer = setTimeout(() => {\n func(...args)\n }, timeout)\n }\n }\n\n // initialize pointer related variables\n private initPointerAndZoom () {\n this.isDown = false\n this.netPanningX = 0\n this.netPanningY = 0\n this.eventCache = []\n this.prevDiff = -1\n if (this.slider) this.slider.value = String(this.baseScale)\n }\n\n // draw image\n private draw () {\n if (!this.img) return\n this.canvasContext?.clearRect(0, 0, this.canvasWidth, this.canvasHeight)\n this.canvasContext?.drawImage(this.img, this.netPanningX, this.netPanningY, this.imgWidth, this.imgHeight)\n }\n\n // fix range\n private fixScale () {\n if (this.fit) {\n this.scale = Math.min(this.imgWidth / this.canvasWidth, this.imgHeight / this.canvasHeight) || this.baseScale\n } else {\n this.scale = Math.min(this.imgWidth / this.originalWidth, this.imgHeight / this.originalHeight) || this.baseScale\n }\n if (this.slider) this.slider.value = String(this.scale)\n }\n\n // recalculate images related variables\n private onImageLoad () {\n if (this.fit) {\n this.scale = Math.max(this.canvasHeight / this.imgHeight, this.canvasWidth / this.imgWidth)\n this.imgHeight *= this.scale\n this.imgWidth *= this.scale\n }\n this.pointerX = this.pointerY = 0\n this.originalWidth = this.imgWidth\n this.originalHeight = this.imgHeight\n this.ratio = this.originalHeight / this.originalWidth\n this.draw()\n }\n\n // get the median point of pointers\n private getPointerAverage () {\n let x = 0; let y = 0\n for (let i = 0; i < this.eventCache.length; i++) {\n x += this.eventCache[i].offsetX\n y += this.eventCache[i].offsetY\n }\n x = x / this.eventCache.length\n y = y / this.eventCache.length\n return [x, y]\n }\n\n // calc origin for zoom and pinch\n private calcOrigin (x: number, y: number) {\n this.originX = (-this.netPanningX + x) / this.imgWidth\n this.originY = (-this.netPanningY + y) / this.imgHeight\n }\n\n public move (x: number, y: number) {\n // the last mousemove event\n const dx = x - this.pointerX\n const dy = y - this.pointerY\n // reset the vars for next mousemove\n this.pointerX = x\n this.pointerY = y\n // accumulate the net panning done\n this.netPanningX = this.fit ? this.clamp(this.netPanningX + dx, this.canvasWidth - this.imgWidth, 0) : this.netPanningX + dx\n this.netPanningY = this.fit ? this.clamp(this.netPanningY + dy, this.canvasHeight - this.imgHeight, 0) : this.netPanningY + dy\n }\n\n private drawZoom (deltaX: number, deltaY: number) {\n this.netPanningX = this.fit ? this.clamp(this.netPanningX - deltaX * this.originX, this.canvasWidth - this.imgWidth, 0) : this.netPanningX - deltaX * this.originX\n this.netPanningY = this.fit ? this.clamp(this.netPanningY - deltaY * this.originY, this.canvasHeight - this.imgHeight, 0) : this.netPanningY - deltaY * this.originY\n }\n\n private zoomDelta (deltaX: number, deltaY: number) {\n const newWidth = this.imgWidth + deltaX\n if (newWidth < this.originalWidth || this.imgHeight + deltaY < this.originalHeight) return\n if (newWidth / this.originalWidth > this.maxScale || newWidth / this.originalWidth < this.minScale) return\n if (this.slider) this.slider.value = String(this.scale = newWidth / this.originalWidth) // TODO: check\n // calc new size\n this.imgWidth = newWidth\n this.imgHeight += deltaY\n // accumulate the net panning done\n this.drawZoom(deltaX, deltaY)\n }\n\n private zoomScale (scale: number) {\n if (scale > this.maxScale || scale < this.minScale) return\n this.prevDiff = -1\n let deltaX = this.imgWidth\n let deltaY = this.imgHeight\n // calc new size\n this.imgWidth = this.originalWidth * scale\n this.imgHeight = this.originalHeight * scale\n // calc diff\n deltaX -= this.imgWidth\n deltaY -= this.imgHeight\n //\n this.calcOrigin(this.canvasWidth / 2, this.canvasHeight / 2)\n this.drawZoom(-deltaX, -deltaY)\n }\n\n private pinch () {\n if (this.eventCache.length === 2) {\n // Calculate the distance between the two pointers\n const curDiff = Math.hypot(this.eventCache[0].offsetX - this.eventCache[1].offsetX, this.eventCache[0].offsetY - this.eventCache[1].offsetY)\n // zoom into image\n if (this.prevDiff > 0) {\n const delta = curDiff - this.prevDiff\n this.zoomDelta(delta, delta * this.ratio)\n }\n this.prevDiff = curDiff\n }\n }\n\n /* -------------------------------------------------------------------------- */\n /* Event Handlers */\n /* -------------------------------------------------------------------------- */\n\n private onSliderMove (e: Event) {\n const value = (e.target as HTMLInputElement).value\n this.scale = +value\n this.zoomScale(this.scale)\n this.draw()\n };\n\n private onPointerdown (e: PointerEvent) {\n if (!this.img) return\n // This event is cached to support 2-finger gestures\n this.eventCache.push(e);\n // refresh move origin\n [this.pointerX, this.pointerY] = this.getPointerAverage()\n this.isDown = true\n };\n\n private onPointerUp (e: PointerEvent) {\n if (!this.isDown) return\n // If the number of pointers down is less than two then reset diff tracker\n this.eventCache = this.eventCache.filter(ev => ev.pointerId !== e.pointerId)\n if (this.eventCache.length < 2) {\n this.prevDiff = -1\n }\n [this.pointerX, this.pointerY] = this.getPointerAverage()\n if (this.eventCache.length === 0) this.isDown = false\n };\n\n private onPointermove (e: PointerEvent) {\n if (!this.isDown) return\n // Find this event in the cache and update its record with this event\n for (let i = 0; i < this.eventCache.length; i++) {\n if (e.pointerId === this.eventCache[i].pointerId) {\n this.eventCache[i] = e; break\n }\n }\n // calc x,y and\n const [x, y] = this.getPointerAverage()\n this.move(x, y)\n this.pinch()\n this.calcOrigin(this.canvasWidth / 2, this.canvasHeight / 2)\n this.draw()\n };\n\n private onResize = this.debounce<[]>(() => {\n if (!this.img) return\n const deltaX = this.canvas.offsetWidth - this.canvasWidth\n const deltaY = this.canvas.offsetHeight - this.canvasHeight\n this.canvasWidth = this.canvas.width = this.canvas.offsetWidth\n this.canvasHeight = this.canvas.height = this.canvas.offsetHeight\n if (this.fit && this.imgWidth < this.canvasWidth) {\n this.netPanningX = 0\n this.onImageLoad()\n } else if (this.fit && this.imgHeight < this.canvasHeight) {\n this.netPanningY = 0\n this.onImageLoad()\n } else {\n this.netPanningX += deltaX / 2\n this.netPanningY += deltaY / 2\n this.originalWidth = this.canvasWidth\n this.originalHeight = this.canvasWidth * this.ratio\n this.draw()\n }\n this.fixScale()\n }, 300)\n\n private prevent (e: Event) {\n e.preventDefault()\n e.stopPropagation()\n }\n\n private leadListeners () {\n this.canvas.addEventListener('pointerdown', (e) => { this.prevent(e); this.onPointerdown(e) })\n this.canvas.addEventListener('pointermove', (e) => { this.prevent(e); this.onPointermove(e) })\n this.canvas.addEventListener('pointerout', (e) => { this.prevent(e); this.onPointerUp(e) })\n this.canvas.addEventListener('pointerup', (e) => { this.prevent(e); this.onPointerUp(e) })\n this.canvas.addEventListener('pointercancel', (e) => { this.prevent(e); this.onPointerUp(e) })\n this.canvas.addEventListener('pointerleave', (e) => { this.prevent(e); this.onPointerUp(e) })\n new ResizeObserver(this.onResize).observe(this.canvas)\n }\n\n /* -------------------------------------------------------------------------- */\n /* Loading */\n /* -------------------------------------------------------------------------- */\n\n public loadSlider (el: HTMLInputElement) {\n this.slider = el\n this.slider.value = String(this.scale || this.baseScale)\n this.slider.addEventListener('input', (e) => { this.prevent(e); this.onSliderMove(e) })\n }\n\n public loadCanvas (el: HTMLCanvasElement, width?: number, height?: number) {\n this.canvas = el\n const context = this.canvas.getContext('2d')\n if (!context) throw Error('could not get a 2d canvas context')\n this.canvasContext = context\n this.canvasWidth = this.canvas.width = width || this.canvas.offsetWidth\n this.canvasHeight = this.canvas.height = height || this.canvas.offsetHeight\n this.leadListeners()\n }\n\n public loadImageFromUrl (url: string, fitImage: boolean = true, onload?: () => void) {\n if (!this.canvas) throw Error('first call loadCanvas')\n this.fit = fitImage\n this.img = new Image()\n this.img.onload = () => {\n this.initPointerAndZoom()\n this.imgHeight = this.img.naturalHeight\n this.imgWidth = this.img.naturalWidth\n this.onImageLoad()\n onload?.()\n }\n this.img.src = url\n }\n\n /* -------------------------------------------------------------------------- */\n /* Export */\n /* -------------------------------------------------------------------------- */\n\n private getCanvas (scale:number) {\n if (!this.img) throw Error('please set an image')\n const canvas = document.createElement('canvas')\n canvas.width = this.canvasWidth * scale\n canvas.height = this.canvasHeight * scale\n const context = canvas.getContext('2d')\n if (!context) throw Error('could not get a 2d canvas context')\n context.drawImage(this.img, this.netPanningX * scale, this.netPanningY * scale, this.imgWidth * scale, this.imgHeight * scale)\n return canvas\n }\n\n public getBlob (scale: number = 1) {\n return new Promise<Blob>((resolve, reject) => {\n this.getCanvas(scale).toBlob((blob) => {\n if (blob) resolve(blob)\n else reject(Error('could not create blob from canvas'))\n })\n })\n }\n\n public getDataUrl (scale: number = 1) {\n return this.getCanvas(scale).toDataURL()\n }\n\n public download (scale: number = 1) {\n const link = document.createElement('a')\n link.download = 'canvas.png'\n link.href = this.getDataUrl(scale)\n link.click()\n }\n\n public getCropInfo () {\n return ({\n originalWidth: this.img.naturalWidth,\n originalHeight: this.img.naturalHeight,\n imgWidth: this.imgWidth,\n imgHeight: this.imgHeight,\n x: this.netPanningX,\n y: this.netPanningY\n })\n }\n}\n\nconst cr = new Cropo({})\n\n/**\n * @deprecated Since version 0.6. Will be deleted in version 1.0. Use Cropo instance instead. (example: cont cr= new Cropo(config); cr.download();)\n */\nexport function download (...arg: Parameters<typeof cr.download>) { cr.download(...arg) };\n/**\n * @deprecated Since version 0.6. Will be deleted in version 1.0. Use Cropo instance instead. (example: new Cropo(config))\n */\nexport function loadCanvas (...arg: Parameters<typeof cr.loadCanvas>) { cr.loadCanvas(...arg) };\n/**\n * @deprecated Since version 0.6. Will be deleted in version 1.0. Use Cropo instance instead. (example: cont cr= new Cropo(config); cr.loadImageFromUrl();)\n */\nexport function loadImageFromUrl (...arg: Parameters<typeof cr.loadImageFromUrl>) { cr.loadImageFromUrl(...arg) };\n/**\n * @deprecated Since version 0.6. Will be deleted in version 1.0. Use Cropo instance instead. (example: new Cropo(config))\n */\nexport function loadSlider (...arg: Parameters<typeof cr.loadSlider>) { cr.loadSlider(...arg) };\n/**\n * @deprecated Since version 0.6. Will be deleted in version 1.0. Use Cropo instance instead. (example: cont cr= new Cropo(config); cr.move();)\n */\nexport function move (...arg: Parameters<typeof cr.move>) { cr.move(...arg) };\n/**\n * @deprecated Since version 0.6. Will be deleted in version 1.0. Use Cropo instance instead.(example: cont cr= new Cropo(config); cr.getCropInfo();)\n */\nexport function getCropInfo (...arg: Parameters<typeof cr.getCropInfo>) { cr.getCropInfo(...arg) };\n/**\n * @deprecated Since version 0.6. Will be deleted in version 1.0. Use Cropo instance instead. (example: cont cr= new Cropo(config); cr.getDataUrl();)\n */\nexport function getDataUrl (...arg: Parameters<typeof cr.getDataUrl>) { cr.getDataUrl(...arg) };\n"],"mappings":"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","names":["script_exports","__export","Cropo","download","getCropInfo","getDataUrl","loadCanvas","loadImageFromUrl","loadSlider","move","__toCommonJS","options","deltaX","deltaY","num","from","to","func","timeout","timer","args","x","y","i","dx","dy","newWidth","scale","curDiff","delta","e","value","ev","el","width","height","context","url","fitImage","onload","canvas","resolve","reject","blob","link","cr","arg"]}