artabro/wire/modules/Inputfield/InputfieldImage/PWImageResizer.min.js

1 line
7.8 KiB
JavaScript
Raw Normal View History

2024-08-27 11:35:37 +02:00
var PWImageResizer=function(config){this.setConfig(config)};PWImageResizer.prototype.resize=function(file,completionCallback){var img=document.createElement("img");this.currentFile=file;var reader=new FileReader;var This=this;var contentType=file.type.toString();reader.onload=function(e){img.src=e.target.result;img.onload=function(){if(!This.needsResize(img,contentType)){completionCallback(false);return}This.scaleImage(img,completionCallback)}};reader.readAsDataURL(file)};PWImageResizer.prototype.needsResize=function(img,contentType){var needsResize=false;var why="n/a";if(contentType!="image/jpeg"&&contentType!="image/png"&&contentType!="image/gif"){why="unsupported image content-type: "+contentType}else if(this.config.scaleRatio>0){needsResize=true;why="scaleRatio specified"}else if(this.config.maxWidth>0||this.config.maxHeight>0){if(this.config.maxWidth>0&&img.width>this.config.maxWidth)needsResize=true;if(this.config.maxHeight>0&&img.height>this.config.maxHeight)needsResize=true;why=needsResize?"dimensions exceed max allowed":"dimensions do not require resize"}if(!needsResize&&this.config.maxSize>0){if(this.config.maxSize<img.width*img.height/1e6)needsResize=true;why=(needsResize?"megapixels exceeds ":"megapixels below ")+this.config.maxSize}if(this.config.debug){this.consoleLog("needsResize="+(needsResize?"Yes":"No")+" ("+why+")")}return needsResize};PWImageResizer.prototype.drawImage=function(context,img,x,y,width,height,deg,flip,flop,center){context.save();if(typeof width==="undefined")width=img.width;if(typeof height==="undefined")height=img.height;if(typeof center==="undefined")center=false;if(center){x-=width/2;y-=height/2}context.translate(x+width/2,y+height/2);var rad=2*Math.PI-deg*Math.PI/180;context.rotate(rad);if(flip)flipScale=-1;else flipScale=1;if(flop)flopScale=-1;else flopScale=1;context.scale(flipScale,flopScale);context.drawImage(img,-width/2,-height/2,width,height);context.restore()};PWImageResizer.prototype.scaleImage=function(img,completionCallback){var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.save();var width=canvas.width;var styleWidth=canvas.style.width;var height=canvas.height;var styleHeight=canvas.style.height;ctx.drawImage(img,0,0);ctx.restore();var ratio=canvas.width/canvas.height;var mWidth=0;var resizeType="";if(this.config.maxWidth>0||this.config.maxHeight>0){mWidth=Math.min(this.config.maxWidth,ratio*this.config.maxHeight);resizeType="max width/height of "+this.config.maxWidth+"x"+this.config.maxHeight}if(this.config.maxSize>0&&this.config.maxSize<canvas.width*canvas.height/1e6){var mSize=Math.floor(Math.sqrt(this.config.maxSize*ratio)*1e3);mWidth=mWidth>0?Math.min(mWidth,mSize):mSize;if(mSize===mWidth)resizeType="max megapixels of "+this.config.maxSize}if(this.config.scaleRatio){var mScale=Math.floor(this.config.scaleRatio*canvas.width);mWidth=mWidth>0?Math.min(mWidth,mScale):mScale;if(mScale==mWidth)resizeType="scale ratio of "+this.config.scaleRatio}if(mWidth<=0){this.consoleLog("image size is too small to resize");completionCallback(false);return}if(this.config.debug){this.consoleLog("original image size: "+canvas.width+"x"+canvas.height+" px");this.consoleLog("scaled image size: "+mWidth+"x"+Math.floor(mWidth/ratio)+" px via "+resizeType)}while(canvas.width>=2*mWidth){canvas=this.getHalfScaleCanvas(canvas)}if(canvas.width>mWidth){canvas=this.scaleCanvasWithAlgorithm(canvas,mWidth)}var quality=this.config.quality;if(this.currentFile.type!="image/jpeg")quality=1;var imageData=canvas.toDataURL(this.currentFile.type,quality);if(typeof this.config.onScale==="function"){this.config.onScale(imageData)}if(this.currentFile.type==="image/jpeg"){try{var exifObj=piexif.load(img.src);var orientation=exifObj["0th"][piexif.ImageIFD.Orientation];if(orientation>4&&img.height>img.width){exifObj["0th"][piexif.ImageIFD.Orientation]=1}try{var exifStr=piexif.dump(exifObj);try{imageData=piexif.insert(exifStr,imageData)}catch(error){console.error(error)}}catch(error){console.error(error)}}catch(error){console.error(error)