修正ios h5上传图时的图片方向问题

时间:2023-03-08 22:49:43
修正ios h5上传图时的图片方向问题
 .ios上传会在exif中带一个 Orientation的属性,这个属性在windows中不会生效,在ios浏览器中会生效,造成图片在windows资源管理器中与ios浏览器中方向不一致 
为了用户体验,需要把图片矫正成正常的图片。短文
需要用到一个 exif 插件 地址 https://github.com/exif-js/exif-js/
代码
function check_file(files){
//校验收集表单数据
// var formdata = new FormData();
if(!files[] || !/image\/\w+/.test(files[].type)){ $.hidePreloader();
$('.li_imgs').children('.imgs').last().children().first().removeAttr('disabled');
_deny_request = false;
return;
} // formdata.append("imgFile0", files[0]); //处理IOS 拍照方向
EXIF.getData(files[],function(){
Orientation = EXIF.getTag(this,'Orientation');
});
var reader = new FileReader();
reader.readAsDataURL(files[]);
reader.onload = function(e) {
getImgData(e);
}
return;
} //e 图片的base64
function getImgData(e){
var image = new Image();
image.src = e.target.result;
image.onload = function() {
var expectWidth = this.naturalWidth;
var expectHeight = this.naturalHeight; if (this.naturalWidth > this.naturalHeight && this.naturalWidth > ) {
expectWidth = ;
expectHeight = expectWidth * this.naturalHeight / this.naturalWidth;
} else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > ) {
expectHeight = ;
expectWidth = expectHeight * this.naturalWidth / this.naturalHeight;
}
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = expectWidth;
canvas.height = expectHeight;
ctx.drawImage(this, , , expectWidth, expectHeight);
var base64 = null;
//修复ios
switch(Orientation){
case ://需要顺时针(向左)90度旋转
rotateImg(this,'left',canvas);
break;
case ://需要逆时针(向右)90度旋转
rotateImg(this,'right',canvas);
break;
case ://需要180度旋转
rotateImg(this,'right',canvas);//转两次
rotateImg(this,'right',canvas);
break;
}
base64 = canvas.toDataURL("image/jpeg", 0.7).substring();//这里处理一下base64编码头,以便php的 base64_decode可以解析,压缩一下图片,否则会413错误
        displayImg(base64);
}
} //对图片旋转处理
function rotateImg(img, direction,canvas) {
//alert(img);
//最小与最大旋转方向,图片旋转4次后回到原方向
var min_step = ;
var max_step = ;
//var img = document.getElementById(pid);
if (img == null)return;
//img的高度和宽度不能在img元素隐藏后获取,否则会出错
var height = img.height;
var width = img.width;
//var step = img.getAttribute('step');
var step = ;
if (step == null) {
step = min_step;
}
if (direction == 'right') {
step++;
//旋转到原位置,即超过最大值
step > max_step && (step = min_step);
} else {
step--;
step < min_step && (step = max_step);
}
//旋转角度以弧度值为参数
var degree = step * * Math.PI / ;
var ctx = canvas.getContext('2d');
switch (step) {
case :
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, , );
break;
case :
canvas.width = height;
canvas.height = width;
ctx.rotate(degree);
ctx.drawImage(img, , -height);
break;
case :
canvas.width = width;
canvas.height = height;
ctx.rotate(degree);
ctx.drawImage(img, -width, -height);
break;
case :
canvas.width = height;
canvas.height = width;
ctx.rotate(degree);
ctx.drawImage(img, -width, );
break;
}
} /**
* android / ios 图片上传
*/
function displayImg(imgBinaryContentbase64){
remove_file_input($('.li_imgs').children('.imgs').last().children().first()); //删除旧的file域
$.showPreloader(_up_img_msg);
var data = {};
if(_IsIosDev){
data['ios'] = imgBinaryContentbase64;
}else{
data['content'] = imgBinaryContentbase64;
} $.ajax({
type:'post',
url:'?c=bzymgr/washcar&a=uploadAndroidImg&openid=<?php echo $this->openid;?>',
data:data,
dataType: "json",
async: true,
success:function(res){
if(res==''){
public_toast('上传失败,请稍后重试',);
return;
}
var html = '';
for(var i in res){
html += '<div class="imgs">\
<img src="'+res[i]+'" class="thumb_img"/>\
<b class="img_cancel" onclick="remove_img(this)">X</b>\
</div>';
//存储到localStorage
add_imgs_LocalStorage(res[i]);
}
//插入dom
$('.li_imgs').children('.imgs').last().before(html);
setTimeout(function(){
$.hidePreloader();
_deny_request = false;
},);
},
error:function(){
public_toast('服务器离家出走了,请稍后重试',);
},
});
}