var windowHeight = document.documentElement.clientHeight, windowWidth = document.documentElement.clientWidth, footerHeight = $("nav").height(), headerHeight = $("#header").height(), contentHeight = windowHeight - footerHeight - headerHeight, canvas = document.getElementById('clipImg'), imgWidth , imgHeight, clickCount = 0; var Clip = { size: 200, //表示正方形的边长,乘上一个基数就是当前的像素值 range: {}, //用来控制正方形的边界值 topCss: (windowHeight - this.size) / 2, leftCss: (windowWidth - this.size) / 2, touchX: 0, touchY: 0, timer: null, imgUrl:"", init: function(){ //等比例缩放图片(如果图片宽高都比容器小,则绘制的图片宽高 = 原图片的宽高。) //如果图片的宽度或者高度比容器大,则宽度或者高度 = 容器的宽度或者高度,另一高度或者宽度则等比例缩放 var cxt = canvas.getContext('2d'); var img = new Image(); img.src = this.imgUrl; // img.src = "../images/xing.jpeg"; img.onload = function(){ if ( img.width < windowWidth && img.height < contentHeight) { imgWidth = img.width; imgHeight = img.height; } else { var pWidth = img.width / (img.height / contentHeight); var pHeight = img.height / (img.width / windowWidth); imgWidth = pWidth > windowWidth ? windowWidth : pWidth; imgHeight = pHeight > contentHeight ? contentHeight : pHeight; } canvas.height = imgHeight; canvas.width = imgWidth; canvas.style.left = (windowWidth - imgWidth) / 2 + 'px';; canvas.style.top = (contentHeight - imgHeight) / 2 + headerHeight + 'px'; cxt.drawImage(img,0,0,imgWidth,imgHeight); Clip.changeBase(0); bindClipEvent(); } }, changeBase: function(index) { //这个函数用来改变正方形的边长 this.size += index * 5 ; if(this.size > imgHeight || this.size > imgWidth){ this.size = imgHeight>imgWidth ? imgWidth : imgHeight; } if((this.size + this.leftCss) > (parseFloat(canvas.style.left) + imgWidth)){ var left = (this.size + this.leftCss) - (parseFloat(canvas.style.left) + imgWidth); this.leftCss = this.leftCss - left; } if((this.size + this.topCss) > (parseFloat(canvas.style.top) + imgHeight)){ var top = (this.size + this.topCss) - (parseFloat(canvas.style.top) + imgHeight); this.topCss = this.topCss - top; } $("#clip").css({ height: this.size + 'px', width: this.size + 'px', lineHeight: this.size + 'px' }); this.changeRange(); }, changeRange: function() { //这个方法用来计算初始top,left以及边界值。相对clipContent而言 if(isNaN(this.topCss)) { this.topCss = (contentHeight - this.size) / 2 + headerHeight; } if(isNaN(this.leftCss)) { this.leftCss = (windowWidth - this.size) / 2; } this.changeClipStyle(this.leftCss, this.topCss); //极限值,需控制不超出图片区域 var minTop = (contentHeight - imgHeight)/2 + headerHeight; var maxTop = (contentHeight - imgHeight)/2+ headerHeight+ imgHeight - this.size; var minLeft = (windowWidth - imgWidth)/2; var maxLeft = (windowWidth - imgWidth)/2 + imgWidth - this.size; this.range = { minTop: minTop, maxTop: maxTop, minLeft: minLeft, maxLeft: maxLeft }; }, //设置新的样式,并改变当前的top和left值 changeClipStyle: function(leftCss, topCss) { $('#clip').css({ left: leftCss + 'px', top: topCss + 'px' }); Clip.leftCss = leftCss; Clip.topCss = topCss; } }; var bindClipEvent = function(){ var clip = document.getElementById('clip'); clip.addEventListener('touchstart', function(event) { event.preventDefault(); var x = event.touches ? event.touches[0].clientX : event.screenX; var y = event.touches ? event.touches[0].clientY : event.screenY; Clip.touchX = x; Clip.touchY = y; }); clip.addEventListener('touchmove', function(event) { if(Clip.timer != null) { return; } Clip.timer = setTimeout(function() { var x = event.touches ? event.touches[0].clientX : event.screenX; var y = event.touches ? event.touches[0].clientY : event.screenY; var disX = x - Clip.touchX; var disY = y - Clip.touchY; var nowLeft = Clip.leftCss + disX; var nowTop = Clip.topCss + disY; if(nowLeft < Clip.range.minLeft) { nowLeft = Clip.range.minLeft; } if(nowLeft > Clip.range.maxLeft) { nowLeft = Clip.range.maxLeft; } if(nowTop < Clip.range.minTop) { nowTop = Clip.range.minTop; } if(nowTop > Clip.range.maxTop) { nowTop = Clip.range.maxTop; } Clip.changeClipStyle(nowLeft, nowTop); Clip.touchX = x; Clip.touchY = y; Clip.timer = null; }, 20); }); //按钮的事件 $("#reduce").on('tap', function(){ Clip.changeBase(-1); }); $("#enlarge").on('tap', function(){ Clip.changeBase(1); }); $("#saveBtn").on('click', function(){ if(clickCount == 0){ clickCount ++; saveImage(); } }); $("#cancelBtn").on('click', function(){ $("#clipPanel").addClass("c-hide"); clearFile(); $("#content").removeClass("c-hide"); }); }; var clearFile = function(){ var str =''; $("#file_head").remove(); $("#chooseImage").append(str); } var saveImage = function(){ var width = Clip.size, height = Clip.size, x = Clip.leftCss - Clip.range.minLeft, y = Clip.topCss - Clip.range.minTop; var canvas2=$('')[0], ctx=canvas2.getContext('2d'); var image = new Image(); image.src = Clip.imgUrl; image.onload = function(){ var widthPix = imgWidth/image.width, heightPix = imgHeight / image.height; ctx.drawImage(image,x/widthPix,y/heightPix,width/widthPix,height/heightPix,0,0,width,height); var data=canvas2.toDataURL(); data=data.split(',')[1]; data=window.atob(data); var ia = new Uint8Array(data.length); for (var i = 0; i < data.length; i++) { ia[i] = data.charCodeAt(i); } var blob=new Blob([ia],{type:"image/png",endings:'transparent'}); var fd=new FormData(); fd.append('file',blob,'image.png'); var new_url = URL.createObjectURL(blob); appendFile(new_url); $.ajax(server + 'upload/image', { data: fd, dataType: 'json', contentType: false, cache: false, processData: false, beforeSend: function(request) { request.setRequestHeader("userAgent", userAgent); }, type: 'post', error: function(res) { if(res.status == 999 || res.status == 998 || res.status == 997){ loginUrl(res.status); return; } clickCount = 0; }, success: function(res) { if(res.status == 999 || res.status == 998 || res.status == 997){ loginUrl(res.status); return; } var params = {}; params.photo = res.urls; var patientUrl = res.urls; sendPost('patient/save', params, 'json', 'post', submitFailed, submitSuccess); clickCount = 0; clearFile(); } }); }; };