|
楼主 |
发表于 2017-6-23 16:08:47
|
显示全部楼层
本帖最后由 liupeng9030 于 2017-7-11 08:59 编辑
这个问题,我解决了。主要还是图片的旋转状态的问题,iphone下拍出来的照片的旋转状态为8或6或3或1。1是正常的、未旋转,3为旋转180度,6为逆时针旋转了90度,8为顺时针旋转了90度。所以在最后截图时,根据图片的旋转状态,将原始图片在canvas上绘制时旋转过来就行了。接下来就是获取base64格式字符串,提交到后台。
1.加入exif.js,用于判断图片的旋转状态(http://download.csdn.net/download/wu858773457/9305057)
2.在页面中加入如下方法:
//获取照片的元信息(拍摄方向)
Model.prototype.getPhotoOrientation = function(img, callback) {
var orient;
EXIF.getData(img, function() {
orient = EXIF.getTag(this, 'Orientation');
callback(orient);
});
}
/*
* 将根据图片和裁剪的区域,进行截图,并转换为base64格式
* -------------------------------------
* @url {string} 图片地址
* @canvasdata {object} 画布(图片)对象数据
* @cropdata {object} 裁剪区域对象数据
* @callback {function} 回调函数
*/
Model.prototype.convertToData = function(url, canvasdata, cropdata, callback) {
var self = this;
var imgw = canvasdata.width; // 图片缩放或则放大后的宽
var imgh = canvasdata.height; // 图片缩放或则放大后的高
var cropw = cropdata.width; // 剪切的宽
var croph = cropdata.height; // 剪切的高
var poleft = canvasdata.left - cropdata.left; // canvas定位图片的左边位置
var potop = canvasdata.top - cropdata.top; // canvas定位图片的上边位置
var canvas = document.createElement("canvas");
var ctx = canvas.getContext('2d');
canvas.width = cropw;
canvas.height = croph;
var img = new Image();
img.onload = function() {
this.width = imgw;
this.height = imgh;
//获取照片的拍摄方向
self.getPhotoOrientation(img, function(orient) {
//判断图片拍摄方向是否顺时针旋转了90度
if (orient == 8) {
ctx.save();//保存状态
ctx.translate(cropw / 2, croph / 2);//设置画布上的(0,0)位置,也就是旋转的中心点
ctx.rotate(-90 * Math.PI / 180);//把画布旋转90度
ctx.translate(-cropw / 2, -croph / 2);
var _x = -(imgh - (-potop) - croph);
var _y = poleft;
// 执行Canvas的drawImage语句
ctx.drawImage(img, _x, _y, imgh, imgw);//把图片绘制在画布translate之前的中心点,
ctx.restore();//恢复状态
}
//判断图片拍摄方向是否逆时针旋转了90度
else if (orient == 6) {
ctx.save();//保存状态
ctx.translate(cropw / 2, croph / 2);//设置画布上的(0,0)位置,也就是旋转的中心点
ctx.rotate(90 * Math.PI / 180);//把画布旋转90度
ctx.translate(-cropw / 2, -croph / 2);
var _x = potop;
var _y = -(imgw - (-poleft) - cropw);
// 执行Canvas的drawImage语句
ctx.drawImage(img, _x, _y, imgh, imgw);//把图片绘制在画布translate之前的中心点,
ctx.restore();//恢复状态
}
//判断图片是否旋转了180度
else if(orient == 3){
ctx.save();//保存状态
ctx.translate(cropw / 2, croph / 2);//设置画布上的(0,0)位置,也就是旋转的中心点
ctx.rotate(180 * Math.PI / 180);//把画布旋转90度
ctx.translate(-cropw / 2, -croph / 2);
var _x = -(imgw - (-poleft) - cropw);
var _y = -(imgh - (-potop) - croph);
// 执行Canvas的drawImage语句
ctx.drawImage(img, _x, _y, imgw, imgh);//把图片绘制在画布translate之前的中心点,
ctx.restore();//恢复状态
}
else {
// 执行Canvas的drawImage语句
ctx.drawImage(img, poleft, potop, imgw, imgh);
}
var base64 = canvas.toDataURL('image/jepg', 0.5);
callback && callback(base64); // 回调base64字符串
});
};
img.src = url;
}
3. 注册保存按钮事件,将将demo中的.cropper("getCroppedCanvas");方法,换为上面的convertToData方法
/*
* 使用该头像(保存)
* -------------------------------------
*/
Model.prototype.btnOKClick = function(event) {
var self = this;
common.showLoading();
//var canvas = $('.cropper-main > img').cropper("getCroppedCanvas");
////保存剪切后的图片
//this.saveCutPic(canvas);
//return;
var $image = $('.cropper-main > img');
var src = $('.cropper-main img:eq(1)').attr("src");
//图片(画布)top、left、width、height
var canvasdata = $image.cropper("getCanvasData");
//裁剪区域的top、left、width、height
var cropBoxData = $image.cropper('getCropBoxData');
//var _scaleR = $('.cropper-main img:eq(1)').prop("naturalWidth") / canvasdata.width;
var _scaleR = 600 / cropBoxData.width;
canvasdata.width *= _scaleR;
canvasdata.height *= _scaleR;
cropBoxData.width *= _scaleR;
cropBoxData.height *= _scaleR;
cropBoxData.top = (cropBoxData.top - canvasdata.top) * _scaleR + canvasdata.top;
cropBoxData.left = (cropBoxData.left - canvasdata.left) * _scaleR + canvasdata.left;
self.convertToData(src, canvasdata, cropBoxData, function(base64Char) {
self.saveCutPic(null, base64Char);
});
};
|
|