问题

在移动端拍照并上传,在某些ios上会进行以西旋转,获取的图片源码,也是旋转过的,导致获取图片后,绘制图片出现问题。

要求

现要求全部统一图片为 树立形式。

原理:

1.在获取源码之前,要判断一下 是否为ios手机

2.旋转图片,旋转角度为多少

3.将图片重回绘制为正常树立图片

4.获取源码上传

 插件:

  exif-js

​介绍:http://code.ciaoca.com/javascript/exif-js/​

1.判断是ios还是安卓

//判断手机类型安卓/ios

function isAndroid_ios() {

var u = navigator.userAgent, app = navigator.appVersion;

var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器

var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端

return isAndroid == true ? true : false;

}

2.获取拍摄得照片是否旋转,角度为多少

//旋转图片操作
function rotateImage(image) {

var width = image.width;

var height = image.height;

var canvas = document.createElement("canvas")

var ctx = canvas.getContext('2d');

var newImage = new Image();

EXIF.getData(image, function () {

var orientation = EXIF.getTag(this, 'Orientation');

switch (orientation) {

//正常状态

case 1:

console.log('旋转0°');

break;

//旋转90度

case 6:

console.log('旋转90°');

canvas.height = width;

canvas.width = height;

ctx.rotate(Math.PI / 2);

ctx.translate(0, -height);

ctx.drawImage(image, 0, 0);

imageDate = canvas.toDataURL('Image/jpeg', 1)

newImage.src = imageDate;

break;

//旋转180°

case 3:

console.log('旋转180°');

canvas.height = height;

canvas.width = width;

ctx.rotate(Math.PI);

ctx.translate(-width, -height);

ctx.drawImage(image, 0, 0);

imageDate = canvas.toDataURL('Image/jpeg', 1)

newImage.src = imageDate;

break;

//旋转270°

case 8:

console.log('旋转270°');

canvas.height = width;

canvas.width = height;

ctx.rotate(-Math.PI / 2);

ctx.translate(-height, 0);

ctx.drawImage(image, 0, 0);

imageDate = canvas.toDataURL('Image/jpeg', 1)

newImage.src = imageDate;

break;

//undefined时不旋转

case undefined:

console.log('undefined 不旋转');

break;

}

});

return newImage;

}

View Code

完整代码

//判断手机类型安卓/ios

function isAndroid_ios() {

var u = navigator.userAgent, app = navigator.appVersion;

var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器

var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端

return isAndroid == true ? true : false;

}


//获取 处理图片
$("#file").change(function (e) {
var file = this.files[0];
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function (e) {
// console.log(this.result);
// $('.person-img').attr('src', this.result);
var result = this.result;
$(".dialog").show();
var img = new Image();
img.src = result;

img.onload = function () {
if (!isAndroid_ios()) {
//如果是旋转得图片,将图片重新赋值
img = rotateImage(img);
}
//处理 上传图片
upload(img)

}
}
});


//旋转图片操作
function rotateImage(image) {

//console.log('rotateImage');

var width = image.width;

var height = image.height;

var canvas = document.createElement("canvas")

var ctx = canvas.getContext('2d');

var newImage = new Image();

EXIF.getData(image, function () {

var orientation = EXIF.getTag(this, 'Orientation');
alert(orientation)
switch (orientation) {

//正常状态

case 1:

console.log('旋转0°');

break;

//旋转90度

case 6:

console.log('旋转90°');

canvas.height = width;

canvas.width = height;

ctx.rotate(Math.PI / 2);

ctx.translate(0, -height);

ctx.drawImage(image, 0, 0);

imageDate = canvas.toDataURL('Image/jpeg', 1)

newImage.src = imageDate;

break;

//旋转180°

case 3:

console.log('旋转180°');

canvas.height = height;

canvas.width = width;

ctx.rotate(Math.PI);

ctx.translate(-width, -height);

ctx.drawImage(image, 0, 0);

imageDate = canvas.toDataURL('Image/jpeg', 1)

newImage.src = imageDate;

break;

//旋转270°

case 8:

console.log('旋转270°');

canvas.height = width;

canvas.width = height;

ctx.rotate(-Math.PI / 2);

ctx.translate(-height, 0);

ctx.drawImage(image, 0, 0);

imageDate = canvas.toDataURL('Image/jpeg', 1)

newImage.src = imageDate;

break;

//undefined时不旋转

case undefined:

console.log('undefined 不旋转');

break;

}

});

return newImage;

}

View Code