-
Notifications
You must be signed in to change notification settings - Fork 2
/
photoMagician.min.js
1 lines (1 loc) · 9.17 KB
/
photoMagician.min.js
1
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.photoMagician=e()}(this,function(){"use strict";var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},a=function(){function t(t,e){for(var a=0;a<e.length;a++){var i=e[a];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,a,i){return a&&t(e.prototype,a),i&&t(e,i),e}}(),i=function(){return function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,e){var a=[],i=!0,r=!1,o=void 0;try{for(var n,s=t[Symbol.iterator]();!(i=(n=s.next()).done)&&(a.push(n.value),!e||a.length!==e);i=!0);}catch(t){r=!0,o=t}finally{try{!i&&s.return&&s.return()}finally{if(r)throw o}}return a}(t,e);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return function(){function r(){e(this,r),this.colors={},this.cover=null,this.canvas=document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.imageFilterType={vintage:"vintage",blackWhite:"blackWhite",invert:"invert",relief:"relief",mirror:"mirror",blur:"blur"},this.outputType={blob:"blob",dataUrl:"dataUrl"},this.defaultImageQuality=1}return a(r,[{key:"setConfig",value:function(t){var e=t.imageQuality;this.defaultImageQuality=e}},{key:"createImageNode",value:function(e,a,i){var r=this;return new Promise(function(o,n){var s=void 0===e?"undefined":t(e);if(Object.is(s,"object"))r.setCanvasWidth(a,i),o(e);else{if(!Object.is(s,"string")){var h="The cover options is not a String of Object\n";throw n(h),new Error(h)}var u=new Image;u.src=e,u.crossOrigin="Anonymous",u.onload=function(){var t=r.getCoverExt(e);r.setCanvasWidth(a||u.width,i||u.height),o({suffix:t,img:u})},u.onerror=n}})}},{key:"getCoverExt",value:function(t){return this.checkCoverType(t),t.replace(/.*\.(jpg|jpeg|png|gif)/,"$1")}},{key:"setCanvasWidth",value:function(t,e){this.canvas.width=t,this.canvas.height=e}},{key:"checkCoverType",value:function(e){if(!Object.is(void 0===e?"undefined":t(e),"string"))throw new Error('cover can not be empty and it must be "string"')}},{key:"getUrl",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=e.outputType,i=void 0===a?this.outputType.dataUrl:a,r=e.suffix,o=e.quality,n=void 0===o?this.defaultImageQuality:o,s=e.canvas,h=void 0===s?this.canvas:s;return new Promise(function(e,a){if(!Object.values(t.outputType).includes(i)){var o="invalid output type, one of "+i.join("|");throw a(o),new Error(o)}i===t.outputType.dataUrl&&e(h.toDataURL("image/"+r),n),h.toBlob(e,"image/"+r,n)})}},{key:"addWaterMark",value:async function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.cover,a=t.coordinate,r=void 0===a?[0,0]:a,o=t.fontBold,n=void 0===o||o,s=t.fontSize,h=void 0===s?20:s,u=t.fontColor,c=void 0===u?"rgba(255,255,255,.5)":u,v=t.mode,d=void 0===v?"text":v,l=t.width,f=void 0===l?50:l,g=t.height,m=void 0===g?50:g,y=t.opacity,w=void 0===y?.5:y,p=t.waterMark,b=t.outputType;if(!Array.isArray(r)||2!==r.length)throw new Error("coordinate must be a array. like [x,y]");var x=Object.is(d,"text"),k=Object.is(d,"image");if(!p)throw new Error("waterMark is required.");if(!x&&!k)throw new Error('mode it must be "text" of "image" .');var C=i(r,2),I=C[0],T=C[1],M=await this.createImageNode(e),j=M.img,E=M.suffix;if(this.waterMarkCanvas=document.createElement("canvas"),this.waterMarkCtx=this.waterMarkCanvas.getContext("2d"),k){var O=(await this.createImageNode(p,j.width,j.height)).img;this.waterMarkCanvas.width=f,this.waterMarkCanvas.height=m,this.waterMarkCtx.globalAlpha=w,this.waterMarkCtx.drawImage(O,0,0,this.waterMarkCanvas.width,this.waterMarkCanvas.height)}return x&&(this.waterMarkCtx.font=(n?"bold":"")+" "+h+(/.*px$/.test(h)?"":"px")+" Microsoft YaHei",this.waterMarkCtx.fillStyle=c,this.waterMarkCtx.textBaseline="middle",this.waterMarkCtx.fillText(p,I,T)),this.ctx.drawImage(j,0,0,j.width,j.height),this.ctx.drawImage(this.waterMarkCanvas,I,T,k?this.waterMarkCanvas.width:j.width,k?this.waterMarkCanvas.height:j.height),await this.getUrl({outputType:b,suffix:E})}},{key:"clipImage",value:async function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=e.cover,r=e.scale,o=void 0===r?1:r,n=e.coordinate,s=void 0===n?[]:n,h=e.outputType;if(s.some(function(t){return!Array.isArray(t)||2!==t.length}))throw new Error("coordinate must be a array, like [[x1,y1],[x2,y2]]");if(!Object.is(void 0===o?"undefined":t(o),"number"))throw new Error("scale must be a number.");var u=i(s,2),c=u[0],v=u[1],d=i(c,2),l=d[0],f=d[1],g=i(v,2),m=g[0],y=g[1],w=Math.abs(m-l),p=Math.abs(y-f),b=await this.createImageNode(a,w,p),x=b.img,k=b.suffix;return this.ctx.drawImage(x,l/o,f/o,w/o,p/o,0,0,w,p),await this.getUrl({outputType:h,suffix:k})}},{key:"copyImageData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.width,a=t.height,i=t.data,r=this.ctx.createImageData(e,a);return r.data.set(i),r}},{key:"transFormImageData",value:async function(t,e,a){this.filterCanvas=document.createElement("canvas"),this.filterCtx=this.filterCanvas.getContext("2d"),this.filterCanvas.width=this.canvas.width,this.filterCanvas.height=this.canvas.height;var i=this.ctx.getImageData(0,0,this.canvas.width,this.canvas.height),r=i.data,o=this.canvas.width*this.canvas.height,n=this.copyImageData(i),s=0,h=0,u=0;switch(t){case this.imageFilterType.vintage:for(var c=0;c<o;c++){var v=.3*r[4*c]+.59*r[4*c+1]+.11*(r[4*c]+2);r[4*c]=v,r[4*c+1]=v,r[4*c+2]=v}break;case this.imageFilterType.blackWhite:for(var d=0;d<o;d++){var l=null;l=.3*r[4*d]+.59*r[4*d+1]+.11*(r[4*d]+2)>127.5?255:0,r[4*d]=l,r[4*d+1]=l,r[4*d+2]=l}break;case this.imageFilterType.invert:for(var f=0;f<o;f+=4){var g=r[f],m=r[f+1],y=r[f+2];r[f]=255-g,r[f+1]=255-m,r[f+2]=255-y}break;case this.imageFilterType.relief:for(var w=1;w<n.width-1;w++)for(var p=1;p<n.height-1;p++){var b=4*(w+p*n.width),x=4*(w-1+p*n.width),k=4*(w+1+p*n.width),C=n.data[k+0]-n.data[x+0]+128,I=n.data[k+1]-n.data[x+1]+128,T=n.data[k+2]-n.data[x+2]+128;C=C<0?0:C>255?255:C,I=I<0?0:I>255?255:I,T=T<0?0:T>255?255:T,r[b+0]=C,r[b+1]=I,r[b+2]=T,r[b+3]=255}break;case this.imageFilterType.mirror:for(var M=0;M<n.width;M++)for(var j=0;j<n.height;j++){var E=4*(M+j*n.width),O=4*(n.width-1-M+j*n.width);r[O+0]=r[E+0],r[O+1]=r[E+1],r[O+2]=r[E+2],r[O+3]=255}break;case this.imageFilterType.blur:for(var U=0;U<n.width;U++)for(var F=0;F<n.height;F++){for(var D=4*(U+F*n.width),N=-2;N<=2;N++){var S=N+U;(S<0||S>=n.width)&&(S=0);for(var A=-2;A<=2;A++){var P=A+F;(P<0||P>=n.height)&&(P=0);var W=4*(S+P*n.width);s+=n.data[W+0],h+=n.data[W+1],u+=n.data[W+2]}}var q=s/25,B=h/25,Q=u/25;s=0,h=0,u=0,r[D+0]=q,r[D+1]=B,r[D+2]=Q,r[D+3]=255}}return this.filterCtx.putImageData(i,0,0,0,0,this.filterCanvas.width,this.filterCanvas.height),await this.getUrl({outputType:a,suffix:e,canvas:this.filterCanvas})}},{key:"addImageFilter",value:async function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.cover,a=t.mode,i=void 0===a?this.imageFilterType.vintage:a,r=t.outputType,o=Object.values(this.imageFilterType);if(!o.includes(i))throw new Error("mode must one of ["+o.join(",")+"]");var n=await this.createImageNode(e),s=n.img,h=n.suffix;return this.ctx.drawImage(s,0,0,s.width,s.height),this.transFormImageData(i,h,r)}},{key:"rotateImage",value:async function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=e.cover,i=e.rotate,r=void 0===i?0:i,o=e.outputType;if(!Object.is(void 0===r?"undefined":t(r),"number"))throw new Error("rotate must be a number.");var n=await this.createImageNode(a),s=n.img,h=n.suffix;return this.ctx.save(),this.ctx.rotate(r*Math.PI/180),this.ctx.drawImage(s,0,0,s.width,s.height),this.ctx.restore(),await this.getUrl({outputType:o,suffix:h})}},{key:"toBase64Url",value:async function(t){var e=t.cover,a=t.outputType,i=await this.createImageNode(e),r=i.img,o=i.suffix;return this.ctx.drawImage(r,0,0,r.width,r.height),await this.getUrl({outputType:a,suffix:o})}},{key:"compressImage",value:async function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=e.cover,i=e.quality,r=void 0===i?.92:i,o=e.outputType;if(!Object.is(void 0===r?"undefined":t(r),"number"))throw new Error("quality must be a number.");var n=(await this.createImageNode(a)).img;this.ctx.drawImage(n,0,0,n.width,n.height);var s=Number(r),h=.92===s?"png":"jpeg";return await this.getUrl({outputType:o,suffix:h,quality:s})}},{key:"getPrimaryColor",value:async function(){var t=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).cover,e=(await this.createImageNode(t)).img;this.ctx.drawImage(e,0,0,e.width,e.height);for(var a=this.ctx.getImageData(0,0,e.width,e.height),i=a.data,r=0,o=a.width*a.height;r<o;r++){var n=[i[4*r],i[4*r+1],i[4*r+2],i[4*r+3]],s="rgba("+n[0]+","+n[1]+","+n[2]+","+n[3]+")";this.colors[s]?this.colors[s].num++:this.colors[s]={color:s,num:1}}return this.getMaxPixelDensity(this.colors)}},{key:"getMaxPixelDensity",value:function(t){var e=Object.values(t).sort(function(t,e){return t.num-e.num});return e[e.length-1].color}}]),r}()});