/* * CROPPIC * dependancy: jQuery * author: Ognjen "Zmaj Džedaj" Božičković and Mat Steinlin */ (function (window, document) { Croppic = function (id, options) { var that = this; that.id = id; that.obj = $('#' + id); that.outputDiv = that.obj; that.imgUrl = ""; that.saveImgUrl = ""; that.imgBackground = ""; // DEFAULT OPTIONS that.options = { uploadUrl: '', uploadData: {}, cropUrl: '', cropData: {}, outputUrlId: '', absorptionUrl: '', //styles imgEyecandy: true, imgEyecandyOpacity: 0.2, initialZoom: 40, zoomFactor: 10, rotateFactor: 5, doubleZoomControls: true, rotateControls: true, modal: false, customUploadButtonId: '', customSaveButtonId: '', loaderHtml: '', scaleToFill: true, processInline: false, loadPicture: '', onReset: null, enableMousescroll: false, colorAbsorption: false, //callbacks onBeforeImgUpload: null, onAfterImgUpload: null, onImgDrag: null, onImgZoom: null, onImgRotate: null, onBeforeImgCrop: null, onAfterImgCrop: null, onBeforeRemoveCroppedImg: null, onAfterRemoveCroppedImg: null, onError: null, }; // OVERWRITE DEFAULT OPTIONS for (i in options) that.options[i] = options[i]; // INIT THE WHOLE DAMN THING!!! that.init(); }; Croppic.prototype = { id: '', imgInitW: 0, imgInitH: 0, imgW: 0, imgH: 0, actualRotationImgW: 0, actualRotationImgH: 0, objW: 0, objH: 0, actualRotation: 0, windowW: 0, windowH: $(window).height(), obj: {}, outputDiv: {}, outputUrlObj: {}, img: {}, defaultImg: {}, croppedImg: {}, imgEyecandy: {}, form: {}, iframeform: {}, iframeobj: {}, cropControlsUpload: {}, cropControlsCrop: {}, cropControlZoomMuchIn: {}, cropControlZoomMuchOut: {}, cropControlZoomIn: {}, cropControlZoomOut: {}, cropControlCrop: {}, cropControlReset: {}, cropControlRemoveCroppedImage: {}, cropControlOriginal: {}, modal: {}, loader: {}, cropSaveControl: {}, ctx: {}, imgName: '', init: function () { var that = this; that.objW = that.obj.width(); that.objH = that.obj.height(); // reset rotation that.actualRotation = 0; that.actualRotationImgH = 0; that.actualRotationImgW = 0; that.colorAbsorption = false; that.imgBackground = ""; that.ctx = {}; that.imgName = ''; if ($.isEmptyObject(that.defaultImg)) { that.defaultImg = that.obj.find('img'); } that.createImgUploadControls(); if ($.isEmptyObject(that.options.loadPicture)) { that.bindImgUploadControl(); } else { that.loadExistingImage(); } }, createImgUploadControls: function () { var that = this; var cropControlUpload = ''; if (that.options.customUploadButtonId === '') { cropControlUpload = ''; } var cropControlRemoveCroppedImage = ''; var cropControlOriginal = ''; if ($.isEmptyObject(that.croppedImg)) { cropControlRemoveCroppedImage = ''; cropControlOriginal = ''; } if (!$.isEmptyObject(that.options.loadPicture)) { cropControlUpload = ''; } var html = '
' + cropControlUpload + cropControlOriginal + cropControlRemoveCroppedImage + '
'; that.outputDiv.append(html); that.cropControlsUpload = that.outputDiv.find('.cropControlsUpload'); if (that.options.customUploadButtonId === '') { that.imgUploadControl = that.outputDiv.find('.cropControlUpload'); } else { that.imgUploadControl = $('#' + that.options.customUploadButtonId); that.imgUploadControl.show(); } if (that.options.customSaveButtonId !== '') { that.cropSaveControl = $('#' + that.options.customSaveButtonId); that.cropSaveControl.hide(); } if (!$.isEmptyObject(that.croppedImg)) { that.cropControlRemoveCroppedImage = that.outputDiv.find('.cropControlRemoveCroppedImage'); that.cropControlOriginal = that.outputDiv.find('.cropControlOriginal'); } }, bindImgUploadControl: function () { var that = this; // CREATE UPLOAD IMG FORM var formHtml = ''; that.outputDiv.append(formHtml); that.form = that.outputDiv.find('.' + that.id + '_imgUploadForm'); // CREATE FALLBACK IE9 IFRAME var fileUploadId = that.CreateFallbackIframe(); that.imgUploadControl.off('click'); that.imgUploadControl.on('click', function () { if (fileUploadId === "") { that.form.find('input[type="file"]').trigger('click'); } else { //Trigger iframe file input click, otherwise access restriction error that.iframeform.find('input[type="file"]').trigger('click'); } }); that.cropSaveControl.off('click'); that.cropSaveControl.on('click', function () { that.destroy(); window.location.href = "https://wwww.croppic.com?" + that.saveImgUrl; }); if (!$.isEmptyObject(that.croppedImg)) { that.cropControlRemoveCroppedImage.on('click', function () { if (typeof (that.options.onBeforeRemoveCroppedImg) === typeof(Function)) { that.options.onBeforeRemoveCroppedImg.call(that); } var res = confirm('您是要使用当前图片还是重新选择图片?\n\r' + '[确认] 使用当前图片\n\r' + '[取消] 重新选择图片'); var width = that.imgInitW; var height = that.imgInitH; that.croppedImg.remove(); that.croppedImg = {}; $(this).hide(); that.cropSaveControl.hide(); that.cropControlOriginal.hide(); if (typeof (that.options.onAfterRemoveCroppedImg) === typeof(Function)) { that.options.onAfterRemoveCroppedImg.call(that); } if (!$.isEmptyObject(that.defaultImg)) { that.obj.append(that.defaultImg); } if (that.options.outputUrlId !== '') { $('#' + that.options.outputUrlId).val(''); } that.imgUploadControl.show(); if (res) { that.showLoader(); that.imgUploadControl.hide(); if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.imgInitW = that.imgW = width; that.imgInitH = that.imgH = height; that.saveImgUrl = ""; that.obj.append(''); that.initCropper(); that.hideLoader(); } }); that.cropControlOriginal.on('click', function () { if (that.imgUrl == '') { alert('请选择图片'); return; } var res = confirm('您确定要使用原图吗?\n\r' + '[确认] 使用原图\n\r' + '[取消] 继续编辑'); if (res) { // that.destroy(); // window.location.href = "https://wwww.croppic.com?" + that.imgUrl; that.controlOriginal(); } }); } that.form.find('input[type="file"]').change(function () { if (that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); that.showLoader(); that.imgUploadControl.hide(); if (that.options.processInline) { // Checking Browser Support for FileReader API if (typeof FileReader == "undefined") { if (that.options.onError) that.options.onError.call(that, "processInline is not supported by your Browser"); that.reset(); } else { var file = that.form.find('input[type="file"]')[0].files[0]; var rFilter = /^(image\/jpeg|image\/png)$/i; // 检查图片格式 if (!rFilter.test(file.type)) { alert("请选择jpeg、png格式的图片"); that.imgUploadControl.show(); that.hideLoader(); return; } if (!$.isEmptyObject(that.croppedImg)) { that.destroy(); } var Orientation = null; //获取照片方向角属性,用户旋转控制 EXIF.getData(file, function () { EXIF.getAllTags(this); Orientation = EXIF.getTag(this, 'Orientation'); // $('#exif').html(EXIF.pretty(this)); // $('#exif').html(Orientation); }); var reader = new FileReader(); reader.onload = function (e) { if (Orientation != null && Orientation != "" && Orientation != 1 && (Orientation == 8 || Orientation == 6 || Orientation == 3)) { that.takingCorrectJs2(e.target.result,Orientation); reader.clear(); reader.destroy(); return; } var image = new Image(); image.src = e.target.result; image.onload = function () { that.imgInitW = that.imgW = image.width; that.imgInitH = that.imgH = image.height; that.imgUrl = image.src; if (that.options.modal) { that.createModal(); } if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.saveImgUrl = ""; that.obj.append(''); that.initCropper(); that.hideLoader(); if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); } }; reader.readAsDataURL(file); } } else { try { // other modern browsers formData = new FormData(that.form[0]); } catch (e) { // IE10 MUST have all form items appended as individual form key / value pairs formData = new FormData(); formData.append('img', that.form.find("input[type=file]")[0].files[0]); } for (var key in that.options.uploadData) { if (that.options.uploadData.hasOwnProperty(key)) { formData.append(key, that.options.uploadData[key]); } } $.ajax({ url: that.options.uploadUrl, data: formData, context: document.body, cache: false, contentType: false, processData: false, type: 'POST' }).always(function (data) { that.afterUpload(data); }); } }); }, takingCorrectJs: function (file) { var that = this; lrz(file, {quality: 1}).then(function (rst) { // console.log(rst.base64); //图片格式为base64; var image = new Image(); image.src = rst.base64; image.onload = function () { that.imgInitW = that.imgW = image.width; that.imgInitH = that.imgH = image.height; that.imgUrl = image.src; if (that.options.modal) { that.createModal(); } if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.saveImgUrl = ""; that.obj.append(''); that.initCropper(); that.hideLoader(); if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); } }).catch(function (err) { alert("打开图片失败"); // 处理失败会执行 }).always(function () { // 不管是成功失败,都会执行 }); }, // 此方法是旋转图片; takingCorrectJs2: function (img, dir) { var that = this; var image = new Image(); image.onload = function () { var degree = 0, drawWidth, drawHeight, width, height; drawWidth = this.naturalWidth; drawHeight = this.naturalHeight; //以下改变一下图片大小 // var maxSide = Math.max(drawWidth, drawHeight); // if (maxSide > 3072) { // var minSide = Math.min(drawWidth, drawHeight); // minSide = minSide / maxSide * 3072; // maxSide = 3072; // if (drawWidth > drawHeight) { // drawWidth = maxSide; // drawHeight = minSide; // } else { // drawWidth = minSide; // drawHeight = maxSide; // } // } var canvas = document.createElement('canvas'); canvas.width = width = drawWidth; canvas.height = height = drawHeight; var context = canvas.getContext('2d'); //判断图片方向,重置canvas大小,确定旋转角度,iphone默认的是home键在右方的横屏拍摄方式 switch (dir) { //iphone横屏拍摄,此时home键在左侧 case 3: degree = 180; drawWidth = -width; drawHeight = -height; break; //iphone竖屏拍摄,此时home键在下方(正常拿手机的方向) case 6: canvas.width = height; canvas.height = width; degree = 90; drawWidth = width; drawHeight = -height; break; //iphone竖屏拍摄,此时home键在上方 case 8: canvas.width = height; canvas.height = width; degree = 270; drawWidth = -width; drawHeight = height; break; } //使用canvas旋转校正 context.rotate(degree * Math.PI / 180); context.drawImage(this, 0, 0, drawWidth, drawHeight); // 判断图片 类型 (可增加判断的类型 此处只判断了 jpeg 和png) var imgtype = img.includes('image/png') ? "image/png" : "image/jpeg"; //返回校正图片 var imageNext = new Image(); imageNext.onload = function () { that.imgInitW = that.imgW = imageNext.width; that.imgInitH = that.imgH = imageNext.height; that.imgUrl = imageNext.src; if (that.options.modal) { that.createModal(); } if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.saveImgUrl = ""; that.obj.append(''); that.initCropper(); that.hideLoader(); if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); } imageNext.src = canvas.toDataURL(imgtype, 1); } image.src = img; }, controlOriginal: function () { var that = this; that.showLoader(); that.cropControlsCrop.hide(); var formData = new FormData(); formData.append("uploadOriginal","1"); if (that.imgName != undefined&&that.imgName!=null&&that.imgName.length>0) { formData.append("imgName", that.imgName); }else { formData.append("imgUrl", that.convertBase64UrlToBlob(that.imgUrl)); } $.ajax({ url: that.options.absorptionUrl, data: formData, cache: false, contentType: false, processData: false, type: 'POST' }).always(function (data) { // if (that.options.onError) that.options.onError.call(that,JSON.stringify(data)); var response; try { response = jQuery.parseJSON(data); } catch (err) { response = typeof data == 'object' ? data : jQuery.parseJSON(data); } if (response.status == 'success') { that.imgName = response.imgName; that.destroy(); // prompt(that.imgUrl); window.location.href = "https://wwww.croppic.com?" +'product_image_crop_md5,' + that.imgName + ','+ that.imgUrl; return; } else if (response.status == 'error') { if (that.options.onError) that.options.onError.call(that, response.message); } else { if (that.options.onError) that.options.onError.call(that, "处理失败"); } that.cropControlsCrop.show(); that.hideLoader(); }); }, takingCorrect: function (file) { var time = new Date(); // 程序计时的月从0开始取值后+1 var t = time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds(); var meg = '开始上传:' + t; var that = this; var formData = new FormData(); var mime = that.getFileMime(file); formData.append("imgUrl", that.convertBase64UrlToBlob(file)); var xhr = new XMLHttpRequest(); xhr.open("POST", "taking", true); xhr.responseType = "blob"; xhr.timeout = 60000 * 5; xhr.onload = function () { if (xhr.readyState === 4 && xhr.status === 200) { var blob = this.response; var Error = this.getResponseHeader("Content-My-Error"); if (Error != null) { var ErrorMeg = decodeURIComponent(atob(Error).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); if (that.options.onError) that.options.onError.call(that, ErrorMeg); that.imgUploadControl.show(); that.hideLoader(); return; } var filename = xhr.getResponseHeader("Content-My-filename"); if (filename != null) { that.imgName = filename; meg = meg + " \n\r" + '上传完成准备处理:' + xhr.getResponseHeader("Content-My-start"); meg = meg + " \n\r" + '处理完成准备下载:' + xhr.getResponseHeader("Content-My-end"); var time2 = new Date(); // 程序计时的月从0开始取值后+1 var t2 = time2.getHours() + ":" + time2.getMinutes() + ":" + time2.getSeconds(); meg = meg + " \n\r" + '下载完成:' + t2; } var reader = new FileReader(); reader.onload = function (e) { var image = new Image(); image.src = e.target.result; image.onload = function () { that.imgInitW = that.imgW = image.width; that.imgInitH = that.imgH = image.height; var arr = image.src.split(','); that.imgUrl = 'data:' + mime + ';base64,' + arr[1]; if (that.options.modal) { that.createModal(); } if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.saveImgUrl = ""; that.obj.append(''); that.initCropper(); that.hideLoader(); if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); // alert(meg); } } reader.readAsDataURL(blob); } else { if (that.options.onError) that.options.onError.call(that, "处理失败,错误代码["+xhr.readyState+"]"); that.imgUploadControl.show(); that.hideLoader(); } }; xhr.send(formData); } , loadExistingImage: function () { var that = this; if ($.isEmptyObject(that.croppedImg)) { if (that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); that.showLoader(); if (that.options.modal) { that.createModal(); } if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.imgUrl = that.options.loadPicture; var img = $(''); that.obj.append(img); img.load(function () { that.imgInitW = that.imgW = this.width; that.imgInitH = that.imgH = this.height; that.initCropper(); that.hideLoader(); if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); }); } else { that.cropControlRemoveCroppedImage.on('click', function () { var res = confirm('您是要使用当前图片还是重新选择图片?\n\r' + '[确认] 使用当前图片\n\r' + '[取消] 重新选择图片'); var width = that.imgInitW; var height = that.imgInitH; that.croppedImg.remove(); $(this).hide(); that.cropSaveControl.hide(); that.cropControlOriginal.hide(); if (!$.isEmptyObject(that.defaultImg)) { that.obj.append(that.defaultImg); } if (that.options.outputUrlId !== '') { $('#' + that.options.outputUrlId).val(''); } that.croppedImg = ''; that.reset(); if (res) { that.showLoader(); that.imgUploadControl.hide(); if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.imgInitW = that.imgW = width; that.imgInitH = that.imgH = height; that.saveImgUrl = ""; that.obj.append(''); that.initCropper(); that.hideLoader(); } }); } }, afterUpload: function (data) { var that = this; response = typeof data == 'object' ? data : jQuery.parseJSON(data); if (response.status == 'success') { that.imgInitW = that.imgW = response.width; that.imgInitH = that.imgH = response.height; if (that.options.modal) { that.createModal(); } if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.imgUrl = response.url; var img = $('') that.obj.append(img); img.load(function () { that.initCropper(); that.hideLoader(); if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); }); if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); } if (response.status == 'error') { alert(response.message); if (that.options.onError) that.options.onError.call(that, response.message); that.hideLoader(); // setTimeout( function(){ that.reset(); },2000) } }, createModal: function () { var that = this; var marginTop = that.windowH / 2 - that.objH / 2; var modalHTML = '
' + '
' + '
'; $('body').append(modalHTML); that.modal = $('#croppicModal'); that.obj = $('#croppicModalObj'); }, destroyModal: function () { var that = this; that.obj = that.outputDiv; that.modal.remove(); that.modal = {}; }, initCropper: function () { var that = this; /*SET UP SOME VARS*/ that.img = that.obj.find('img'); that.img.wrap('
'); /*INIT DRAGGING*/ that.createCropControls(); if (that.options.imgEyecandy) { that.createEyecandy(); } that.initDrag(); that.initialScaleImg(); }, createEyecandy: function () { var that = this; that.imgEyecandy = that.img.clone(); that.imgEyecandy.css({'z-index': '0', 'opacity': that.options.imgEyecandyOpacity}).appendTo(that.obj); }, destroyEyecandy: function () { var that = this; that.imgEyecandy.remove(); }, initialScaleImg: function () { var that = this; that.zoom(0); that.zoom(that.options.initialZoom); // Adding mousewheel zoom capabilities if (that.options.enableMousescroll) { that.img.on('mousewheel', function (event) { event.preventDefault(); if (that.colorAbsorption) { return; } that.zoom(that.options.zoomFactor * event.deltaY); }); } // initial center image that.img.css({ 'left': -(that.imgW - that.objW) / 2, 'top': -(that.imgH - that.objH) / 2, 'position': 'relative' }); if (that.options.imgEyecandy) { that.imgEyecandy.css({ 'left': -(that.imgW - that.objW) / 2, 'top': -(that.imgH - that.objH) / 2, 'position': 'relative' }); } }, createCropControls: function () { var that = this; // CREATE CONTROLS var cropControlZoomMuchIn = ''; var cropControlZoomIn = ''; var cropControlZoomOut = ''; var cropControlZoomMuchOut = ''; var cropControlRotateLeft = ''; var cropControlRotateRight = ''; var cropControlRotateMuchLeft = ''; var cropControlRotateMuchRight = ''; var cropControlCrop = ''; var cropControlReset = ''; var cropControlOriginal = ''; var cropControlXiColor = ''; var cropControlXiColor2 = ''; var cropControlSetColor = ''; var html; if (that.options.doubleZoomControls) { cropControlZoomMuchIn = ''; cropControlZoomMuchOut = ''; } if (that.options.rotateControls) { cropControlRotateLeft = ''; cropControlRotateRight = ''; cropControlRotateMuchLeft = ''; cropControlRotateMuchRight = ''; } html = '
' + cropControlZoomMuchIn + cropControlZoomIn + cropControlZoomOut + cropControlZoomMuchOut + cropControlRotateMuchLeft + cropControlRotateLeft + cropControlRotateRight + cropControlRotateMuchRight + cropControlCrop + '
'; that.obj.append(html); html = '
' + cropControlXiColor2 + cropControlXiColor + cropControlSetColor + cropControlOriginal + cropControlReset + '
'; that.obj.append(html); that.cropControlsCrop = that.obj.find('.cropControlsCrop'); // CACHE AND BIND CONTROLS if (that.options.doubleZoomControls) { that.cropControlZoomMuchIn = that.cropControlsCrop.find('.cropControlZoomMuchIn'); that.cropControlZoomMuchIn.on('click', function () { that.zoom(that.options.zoomFactor * 10); }); that.cropControlZoomMuchOut = that.cropControlsCrop.find('.cropControlZoomMuchOut'); that.cropControlZoomMuchOut.on('click', function () { that.zoom(-that.options.zoomFactor * 10); }); } that.cropControlZoomIn = that.cropControlsCrop.find('.cropControlZoomIn'); that.cropControlZoomIn.on('click', function () { that.zoom(that.options.zoomFactor); }); that.cropControlZoomOut = that.cropControlsCrop.find('.cropControlZoomOut'); that.cropControlZoomOut.on('click', function () { that.zoom(-that.options.zoomFactor); }); that.cropControlRotateLeft = that.cropControlsCrop.find('.cropControlRotateLeft'); that.cropControlRotateLeft.on('click', function () { that.rotate(-0.5); }); that.cropControlRotateMuchLeft = that.cropControlsCrop.find('.cropControlRotateMuchLeft'); that.cropControlRotateMuchLeft.on('click', function () { that.rotate(-10); }); that.cropControlRotateRight = that.cropControlsCrop.find('.cropControlRotateRight'); that.cropControlRotateRight.on('click', function () { that.rotate(0.5); }); that.cropControlRotateMuchRight = that.cropControlsCrop.find('.cropControlRotateMuchRight'); that.cropControlRotateMuchRight.on('click', function () { that.rotate(10); }); that.cropControlCrop = that.cropControlsCrop.find('.cropControlCrop'); that.cropControlCrop.on('click', function () { that.crop(); }); that.cropControlReset = that.cropControlsCrop.find('.cropControlReset'); that.cropControlReset.on('click', function () { var res = confirm('您是要使用当前图片还是重新选择图片?\n\r' + '[确认] 使用当前图片\n\r' + '[取消] 重新选择图片'); var width = that.imgInitW; var height = that.imgInitH; that.reset(); if (res) { that.showLoader(); that.imgUploadControl.hide(); if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } that.imgInitW = that.imgW = width; that.imgInitH = that.imgH = height; that.saveImgUrl = ""; that.obj.append(''); that.initCropper(); that.hideLoader(); } }); that.cropControlOriginal = that.cropControlsCrop.find('.cropControlOriginal'); that.cropControlOriginal.on('click', function () { if (that.imgUrl == '') { alert('请选择图片'); return; } var res = confirm('您确定要使用原图吗?\n\r' + '[确认] 使用原图\n\r' + '[取消] 继续编辑'); if (res) { // that.destroy(); // window.location.href = "https://wwww.croppic.com?" + that.imgUrl; that.controlOriginal(); } }); that.cropControlXiColor = that.cropControlsCrop.find('.cropControlXiColor'); that.cropControlXiColor.on('click', function () { that.colorOnClick(false); }); that.cropControlXiColor2 = that.cropControlsCrop.find('.cropControlXiColor2'); that.cropControlXiColor2.on('click', function () { that.colorOnClick(false); }); that.cropControlSetColor = that.cropControlsCrop.find('.cropControlSetColor'); that.cropControlSetColor.on('click', function () { that.colorOnClick(true); }); that.colpick = that.cropControlSetColor.colpick({ onSubmit: function (hsb, hex, rgb, el) { var background = "rgb(" + rgb.r + "," + rgb.g + "," + rgb.b + ")"; that.obj.find('.cropImgWrapper').css('background', background); $(el).colpickHide(); that.imgBackground = background; } }); }, colorOnClick: function (input) { var that = this; if (that.colorAbsorption || input) { that.cropControlsCrop.find('.cropControlXiColor').css("display", "block"); that.cropControlsCrop.find('.cropControlXiColor2').css("display", "none"); that.colorAbsorption = false; } else { that.cropControlsCrop.find('.cropControlXiColor').css("display", "none"); that.cropControlsCrop.find('.cropControlXiColor2').css("display", "block"); that.colorAbsorption = true; } }, absorption: function (pageX, pageY) { var that = this; that.showLoader(); that.cropControlsCrop.hide(); var cropData = { imgInitW: that.imgInitW, imgInitH: that.imgInitH, imgW: that.imgW, imgH: that.imgH, imgY1: parseInt(that.img.css('top')), imgX1: parseInt(that.img.css('left')), cropH: that.objH, cropW: that.objW, rotation: that.actualRotation, pageX: pageX, pageY: pageY, imgBackground: that.imgBackground }; var formData = new FormData(); for (var key in cropData) { if (cropData.hasOwnProperty(key)) { formData.append(key, cropData[key]); } } if (that.imgName == '') { formData.append("imgUrl", that.convertBase64UrlToBlob(that.imgUrl)); } else { formData.append("imgName", that.imgName); } $.ajax({ url: that.options.absorptionUrl, data: formData, cache: false, contentType: false, processData: false, type: 'POST' }).always(function (data) { var response; try { response = jQuery.parseJSON(data); } catch (err) { response = typeof data == 'object' ? data : jQuery.parseJSON(data); } if (response.status == 'success') { that.imgName = response.imgName; var rgb = {r: response.r, g: response.g, b: response.b}; var background = "rgb(" + rgb.r + "," + rgb.g + "," + rgb.b + ")"; that.obj.find('.cropImgWrapper').css("background", background); that.imgBackground = background; that.cropControlSetColor.colpickSetColor(rgb); } else if (response.status == 'error') { if (that.options.onError) that.options.onError.call(that, response.message); } else { if (that.options.onError) that.options.onError.call(that, "处理失败"); } that.cropControlsCrop.show(); that.hideLoader(); }); }, initDrag: function () { var that = this; that.img.on("mousedown touchstart", function (e) { e.preventDefault(); // disable selection var pageX; var pageY; var userAgent = window.navigator.userAgent; if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/android/i) || (e.pageY && e.pageX) == undefined) { pageX = e.originalEvent.touches[0].pageX; pageY = e.originalEvent.touches[0].pageY; } else { pageX = e.pageX; pageY = e.pageY; } var z_idx = that.img.css('z-index'), drg_h = that.img.outerHeight(), drg_w = that.img.outerWidth(), pos_y = that.img.offset().top + drg_h - pageY, pos_x = that.img.offset().left + drg_w - pageX; that.z_idx = z_idx; that.drg_h = drg_h; that.drg_w = drg_w; that.pos_y = pos_y; that.pos_x = pos_x; if (that.colorAbsorption) { if (that.actualRotation !== 0) { that.absorption(pageX - 10, pageY - 50); return; } var ml = that.imgInitW / that.imgW; var x = pageX - parseInt(that.img.css('left')) - 10; var y = pageY - parseInt(that.img.css('top')) - 50; x = parseInt(x * ml); y = parseInt(y * ml); if (!(x < 0 || x > that.imgInitW || y < 0 || y > that.imgInitH)) { var imgData = {}; if ($.isEmptyObject(that.ctx)) { var canvas = document.createElement("canvas"); if (!canvas.getContext) { alert("浏览器版本太低无法使用吸色!"); return; } that.ctx = canvas.getContext("2d"); var newImg = new Image(); newImg.onload = function () { canvas.width = that.imgInitW; canvas.height = that.imgInitH; that.ctx.drawImage(newImg, 0, 0); imgData = that.ctx.getImageData(x, y, 1, 1); var rgb = {r: imgData.data[0], g: imgData.data[1], b: imgData.data[2]}; var background = "rgb(" + rgb.r + "," + rgb.g + "," + rgb.b + ")"; that.obj.find('.cropImgWrapper').css("background", background); that.imgBackground = background; that.cropControlSetColor.colpickSetColor(rgb); } newImg.src = that.imgUrl; } else { imgData = that.ctx.getImageData(x, y, 1, 1); var rgb = {r: imgData.data[0], g: imgData.data[1], b: imgData.data[2]}; var background = "rgb(" + rgb.r + "," + rgb.g + "," + rgb.b + ")"; that.obj.find('.cropImgWrapper').css("background", background); that.imgBackground = background; that.cropControlSetColor.colpickSetColor(rgb); } } return; } }).on("mouseup", function () { that.img.off("mousemove"); }).on("mouseout", function () { that.img.off("mousemove"); }); that.img.css('z-index', 1000).on("mousemove touchmove", function (e) { e.preventDefault(); if (that.colorAbsorption) { return; } var z_idx = that.z_idx; var drg_h = that.drg_h; var drg_w = that.drg_w; var pos_y = that.pos_y; var pos_x = that.pos_x; var imgTop; var imgLeft; var userAgent = window.navigator.userAgent; if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/android/i) || (e.pageY && e.pageX) == undefined) { imgTop = e.originalEvent.touches[0].pageY + pos_y - drg_h; imgLeft = e.originalEvent.touches[0].pageX + pos_x - drg_w; } else { imgTop = e.pageY + pos_y - drg_h; imgLeft = e.pageX + pos_x - drg_w; } that.img.offset({ top: imgTop, left: imgLeft }).on("mouseup", function () { $(this).removeClass('draggable').css('z-index', z_idx); }); if (that.options.imgEyecandy) { that.imgEyecandy.offset({top: imgTop, left: imgLeft}); } var top = that.actualRotationImgH; var left = that.actualRotationImgW; if (that.objH < that.imgH + top * 2) { if (parseInt(that.img.css('top')) > top) { that.img.css('top', top); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', top); } } var maxTop = -(that.imgH - that.objH + top); if (parseInt(that.img.css('top')) < maxTop) { that.img.css('top', maxTop); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', maxTop); } } } else { if (parseInt(that.img.css('top')) < -top) { that.img.css('top', -top); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', -top); } } var maxTop = that.objH - that.imgH + top; if (parseInt(that.img.css('top')) > maxTop) { that.img.css('top', maxTop); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', maxTop); } } } if (that.objW < that.imgW + 2 * left) { if (parseInt(that.img.css('left')) > left) { that.img.css('left', left); if (that.options.imgEyecandy) { that.imgEyecandy.css('left', left); } } var maxLeft = -(that.imgW - that.objW + left); if (parseInt(that.img.css('left')) < maxLeft) { that.img.css('left', maxLeft); if (that.options.imgEyecandy) { that.imgEyecandy.css('left', maxLeft); } } } else { if (parseInt(that.img.css('left')) < -left) { that.img.css('left', -left); if (that.options.imgEyecandy) { that.imgEyecandy.css('left', -left); } } var maxLeft = (that.objW - that.imgW + left); if (parseInt(that.img.css('left')) > maxLeft) { that.img.css('left', maxLeft); if (that.options.imgEyecandy) { that.imgEyecandy.css('left', maxLeft); } } } if (that.options.onImgDrag) that.options.onImgDrag.call(that); }); }, rotate: function (x) { var that = this; that.colorOnClick(true); that.actualRotation += x; that.img.css({ '-webkit-transform': 'rotate(' + that.actualRotation + 'deg)', '-moz-transform': 'rotate(' + that.actualRotation + 'deg)', 'transform': 'rotate(' + that.actualRotation + 'deg)', }); if (that.options.imgEyecandy) { that.imgEyecandy.css({ '-webkit-transform': 'rotate(' + that.actualRotation + 'deg)', '-moz-transform': 'rotate(' + that.actualRotation + 'deg)', 'transform': 'rotate(' + that.actualRotation + 'deg)', }); } that.actualRotationImgH = 0; that.actualRotationImgW = 0; if (that.actualRotation != 0) { var actualRotation = that.actualRotation % 360; if (actualRotation < 0) { actualRotation = 0 - actualRotation; } if (actualRotation == 90 || actualRotation == 270) { if (that.imgH > that.imgW) { that.actualRotationImgW = parseInt((that.imgH - that.imgW) / 2); } else if (that.imgH < that.imgW) { that.actualRotationImgH = parseInt((that.imgW - that.imgH) / 2); } } else if (actualRotation != 180 && actualRotation != 360) { if (actualRotation > 180) { actualRotation = actualRotation - 180; } if (actualRotation > 90) { actualRotation = 180 - actualRotation; } var radian = Math.sin(actualRotation * Math.PI / 180); that.actualRotationImgW = parseInt(radian * (that.imgH) / 2); that.actualRotationImgH = parseInt(radian * (that.imgW) / 2); } } if (typeof that.options.onImgRotate == 'function') that.options.onImgRotate.call(that); }, zoom: function (x) { var that = this; that.colorOnClick(true); var ratio = that.imgW / that.imgH; var newWidth = that.imgW + x; var newHeight = newWidth / ratio; var doPositioning = true; if (x == 0) { if (newWidth - that.objW < newHeight - that.objH) { newWidth = that.objW; newHeight = newWidth / ratio; } else { newHeight = that.objH; newWidth = ratio * newHeight; } } if (newWidth < that.objW || newHeight < that.objH) { doPositioning = false; } if (!that.options.scaleToFill && (newWidth > that.imgInitW || newHeight > that.imgInitH)) { doPositioning = false; } that.imgW = newWidth; that.img.width(newWidth); that.imgH = newHeight; that.img.height(newHeight); var newTop = parseInt(that.img.css('top')) - x / 2; var newLeft = parseInt(that.img.css('left')) - x / 2; that.actualRotationImgH = 0; that.actualRotationImgW = 0; if (that.actualRotation != 0) { var actualRotation = that.actualRotation % 360; if (actualRotation < 0) { actualRotation = 0 - actualRotation; } if (actualRotation == 90 || actualRotation == 270) { if (that.imgH > that.imgW) { that.actualRotationImgW = parseInt((that.imgH - that.imgW) / 2); } else if (that.imgH < that.imgW) { that.actualRotationImgH = parseInt((that.imgW - that.imgH) / 2); } } else if (actualRotation != 180 && actualRotation != 360) { if (actualRotation > 180) { actualRotation = actualRotation - 180; } if (actualRotation > 90) { actualRotation = 180 - actualRotation; } var radian = Math.sin(actualRotation * Math.PI / 180); that.actualRotationImgW = parseInt(radian * (that.imgH) / 2); that.actualRotationImgH = parseInt(radian * (that.imgW) / 2); } } if (newTop > -that.actualRotationImgH) { newTop = -that.actualRotationImgH; } if (newLeft > -that.actualRotationImgW) { newLeft = -that.actualRotationImgW; } var maxTop = -(newHeight - that.objH + that.actualRotationImgH); if (newTop < maxTop) { newTop = maxTop; } var maxLeft = -(newWidth - that.objW + that.actualRotationImgW); if (newLeft < maxLeft) { newLeft = maxLeft; } if (doPositioning) { that.img.css({'top': newTop, 'left': newLeft}); } if (that.options.imgEyecandy) { that.imgEyecandy.width(newWidth); that.imgEyecandy.height(newHeight); if (doPositioning) { that.imgEyecandy.css({'top': newTop, 'left': newLeft}); } } if (that.options.onImgZoom) that.options.onImgZoom.call(that); }, crop: function () { var that = this; that.colorOnClick(true); if (that.options.onBeforeImgCrop) that.options.onBeforeImgCrop.call(that); that.cropControlsCrop.hide(); that.showLoader(); var cropData = { imgInitW: that.imgInitW, imgInitH: that.imgInitH, imgW: that.imgW, imgH: that.imgH, imgY1: parseInt(that.img.css('top')), imgX1: parseInt(that.img.css('left')), cropH: that.objH, cropW: that.objW, rotation: that.actualRotation, imgBackground: that.imgBackground }; var formData = new FormData(); for (var key in cropData) { if (cropData.hasOwnProperty(key)) { formData.append(key, cropData[key]); } } for (var key in that.options.cropData) { if (that.options.cropData.hasOwnProperty(key)) { formData.append(key, that.options.cropData[key]); } } if (that.imgName == '') { formData.append("imgUrl", that.convertBase64UrlToBlob(that.imgUrl)); } else { formData.append("imgName", that.imgName); } var xhr = new XMLHttpRequest(); xhr.open("POST", that.options.cropUrl); xhr.responseType = "blob"; xhr.timeout = 60000 * 5; xhr.onload = function () { that.afterCrop(xhr); }; xhr.send(formData); }, convertBase64UrlToBlob: function (urlData) { var arr = urlData.split(','); var mime = arr[0].match(/:(.*?);/)[1]; var bytes = window.atob(urlData.split(',')[1]); //去掉url的头,并转换为byte //处理异常,将ascii码小于0的转换为大于0 var ab = new ArrayBuffer(bytes.length); var ia = new Uint8Array(ab); for (var i = 0; i < bytes.length; i++) { ia[i] = bytes.charCodeAt(i); } return new Blob([ab], {type: mime}); }, getFileMime: function (urlData) { var arr = urlData.split(','); return arr[0].match(/:(.*?);/)[1]; }, getFileExt: function (urlData) { var arr = urlData.split(','); var mime = arr[0].match(/:(.*?);/)[1]; var FileExt; switch (mime) { case "image/jpeg": FileExt = "jpg"; break; case "image/png": FileExt = "png"; break; case "image/gif": FileExt = "gif"; break; default: FileExt = "jpg"; } return FileExt; }, afterCrop: function (xhr) { var that = this; if (xhr.readyState === 4 && xhr.status === 200) { var Error = xhr.getResponseHeader("Content-My-Error"); if (Error != null) { var ErrorMeg = decodeURIComponent(atob(Error).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); if (that.options.onError) that.options.onError.call(that, ErrorMeg); that.cropControlsCrop.show(); that.hideLoader(); return; } if (that.options.imgEyecandy) that.imgEyecandy.hide(); var filename = xhr.getResponseHeader("Content-My-filename"); var blob = xhr.response; var reader = new FileReader(); reader.onload = function (e) { that.destroy(); that.saveImgUrl = 'product_image_crop_md5,' + filename + ',' + e.target.result; var croppedImg = ''; that.obj.append(croppedImg); if (that.options.outputUrlId !== '') { $('#' + that.options.outputUrlId).val(response.url); } that.croppedImg = that.obj.find('.croppedImg'); that.croppedImg.width(that.objW + "px").height(that.objH + "px"); that.init(); that.hideLoader(); that.imgUploadControl.hide(); that.cropSaveControl.show(); } reader.readAsDataURL(blob); } else { if (that.options.onError) that.options.onError.call(that, "处理失败,错误代码["+xhr.readyState+"]=>"+ xhr.response.messageerror); that.hideLoader(); that.cropControlsCrop.show(); } if (that.options.onAfterImgCrop) that.options.onAfterImgCrop.call(that, xhr.response); }, showLoader: function () { var that = this; that.obj.append(that.options.loaderHtml); that.loader = that.obj.find('.loader'); }, hideLoader: function () { var that = this; that.loader.remove(); }, reset: function () { var that = this; that.destroy(); that.init(); that.imgUploadControl.show(); if (!$.isEmptyObject(that.croppedImg)) { that.obj.append(that.croppedImg); if (that.options.outputUrlId !== '') { $('#' + that.options.outputUrlId).val(that.croppedImg.attr('url')); } } if (typeof that.options.onReset == 'function') that.options.onReset.call(that); }, destroy: function () { var that = this; that.colorOnClick(true); if (that.options.modal && !$.isEmptyObject(that.modal)) { that.destroyModal(); } if (that.options.imgEyecandy && !$.isEmptyObject(that.imgEyecandy)) { that.destroyEyecandy(); } if (!$.isEmptyObject(that.cropControlsUpload)) { that.cropControlsUpload.remove(); } if (!$.isEmptyObject(that.cropControlsCrop)) { that.cropControlsCrop.remove(); } if (!$.isEmptyObject(that.loader)) { that.loader.remove(); } if (!$.isEmptyObject(that.form)) { that.form.remove(); } that.obj.html(''); }, isAjaxUploadSupported: function () { var input = document.createElement("input"); input.type = "file"; return ( "multiple" in input && typeof File != "undefined" && typeof FormData != "undefined" && typeof (new XMLHttpRequest()).upload != "undefined"); }, CreateFallbackIframe: function () { var that = this; if (!that.isAjaxUploadSupported()) { if (jQuery.isEmptyObject(that.iframeobj)) { var iframe = document.createElement("iframe"); iframe.setAttribute("id", that.id + "_upload_iframe"); iframe.setAttribute("name", that.id + "_upload_iframe"); iframe.setAttribute("width", "0"); iframe.setAttribute("height", "0"); iframe.setAttribute("border", "0"); iframe.setAttribute("src", "javascript:false;"); iframe.style.display = "none"; document.body.appendChild(iframe); } else { iframe = that.iframeobj[0]; } var myContent = '' + 'Uploading File' + '' + '
' + $("#" + that.id + '_imgUploadField')[0].outerHTML + '
'; iframe.contentWindow.document.open('text/htmlreplace'); iframe.contentWindow.document.write(myContent); iframe.contentWindow.document.close(); that.iframeobj = $("#" + that.id + "_upload_iframe"); that.iframeform = that.iframeobj.contents().find("html").find("." + that.id + "_upload_iframe_form"); that.iframeform.on("change", "input", function () { that.SubmitFallbackIframe(that); }); that.iframeform.find("input")[0].attachEvent("onchange", function () { that.SubmitFallbackIframe(that); }); var eventHandlermyFile = function () { if (iframe.detachEvent) iframe.detachEvent("onload", eventHandlermyFile); else iframe.removeEventListener("load", eventHandlermyFile, false); var response = that.getIframeContentJSON(iframe); if (jQuery.isEmptyObject(that.modal)) { that.afterUpload(response); } } if (iframe.addEventListener) iframe.addEventListener("load", eventHandlermyFile, true); if (iframe.attachEvent) iframe.attachEvent("onload", eventHandlermyFile); return "#" + that.id + '_imgUploadField'; } else { return ""; } }, SubmitFallbackIframe: function (that) { that.showLoader(); if (that.options.processInline && !that.options.uploadUrl) { if (that.options.onError) { that.options.onError.call(that, "processInline is not supported by your browser "); that.hideLoader(); } } else { if (that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); that.iframeform[0].submit(); } }, getIframeContentJSON: function (iframe) { try { var doc = iframe.contentDocument ? iframe.contentDocument : iframe.contentWindow.document, response; var innerHTML = doc.body.innerHTML; if (innerHTML.slice(0, 5).toLowerCase() == "
" && innerHTML.slice(-6).toLowerCase() == "
") { innerHTML = doc.body.firstChild.firstChild.nodeValue; } response = jQuery.parseJSON(innerHTML); } catch (err) { response = {success: false}; } return response; }, hexadecimal: function (num) { var r = parseInt(num).toString(16); if (r.length == 1) { return '0' + r; } return r.toUpperCase(); } }; })(window, document);