用html5编写图片裁切上传,在iphone手机上可能会遇到图片方向错误问题,在此把解决方法和大家分享一下,
用到了html5的 FileReader和Canvas,如果还没有接触的同学,先了解一下其方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//此方法为file input元素的change事件 function change(){ var file = this .files[0]; var orientation; //EXIF js 可以读取图片的元信息 https://github.com/exif-js/exif-js EXIF.getData(file, function (){ orientation=EXIF.getTag( this , 'Orientation' ); }); var reader = new FileReader(); reader.onload = function (e) { getImgData( this .result,orientation, function (data){ //这里可以使用校正后的图片data了 }); } reader.readAsDataURL(file); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// @param {string} img 图片的base64 // @param {int} dir exif获取的方向信息 // @param {function} next 回调方法,返回校正方向后的base64 function getImgData(img,dir,next){ 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 > 1024) { var minSide = Math.min(drawWidth, drawHeight); minSide = minSide / maxSide * 1024; maxSide = 1024; 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); //返回校正图片 next(canvas.toDataURL( "image/jpeg" ,.8)); } image.src=img; } |