/*
* 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'
+ ''
+ '';
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);