html5+exif.js+canvas实现手机端照片上传预览、压缩、旋转功能

html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题;Android手机没这个问题。
因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正。
利用exif.js读取照片的拍摄信息,详见http://code.ciaoca.com/javascript/exif-js/
这里主要用到Orientation属性。
Orientation属性说明如下:

旋转角度 参数
1
顺时针90° 6
逆时针90° 8
180° 3


html5页面:

[html]view plain copy print ?
  1. 图片上传 - 锐客网
  2. 上传图片:
  • html5+exif.js+canvas实现手机端照片上传预览、压缩、旋转功能
    文章图片

  • 自己写的js:

    [javascript]view plain copy print ?
    1. function selectFileImage(fileObj) {
    2. var file = fileObj.files['0'];
    3. //图片方向角 added by lzk
    4. var Orientation = null;
    5. if (file) {
    6. console.log("正在上传,请稍后...");
    7. var rFilter = /^(image\/jpeg|image\/png)$/i; // 检查图片格式
    8. if (!rFilter.test(file.type)) {
    9. //showMyTips("请选择jpeg、png格式的图片", false);
    10. return;
    11. }
    12. // var URL = URL || webkitURL;
    13. //获取照片方向角属性,用户旋转控制
    14. EXIF.getData(file, function() {
    15. // alert(EXIF.pretty(this));
    16. EXIF.getAllTags(this);
    17. //alert(EXIF.getTag(this, 'Orientation'));
    18. Orientation = EXIF.getTag(this, 'Orientation');
    19. //return;
    20. });
    21. var oReader = new FileReader();
    22. oReader.onload = function(e) {
    23. //var blob = URL.createObjectURL(file);
    24. //_compress(blob, file, basePath);
    25. var image = new Image();
    26. image.src = https://www.it610.com/article/e.target.result;
    27. image.onload = function() {
    28. var expectWidth = this.naturalWidth;
    29. var expectHeight = this.naturalHeight;
    30. if (this.naturalWidth > this.naturalHeight && this.naturalWidth > 800) {
    31. expectWidth = 800;
    32. expectHeight = expectWidth * this.naturalHeight / this.naturalWidth;
    33. } else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > 1200) {
    34. expectHeight = 1200;
    35. expectWidth = expectHeight * this.naturalWidth / this.naturalHeight;
    36. }
    37. alert(expectWidth+','+expectHeight);
    38. var canvas = document.createElement("canvas");
    39. var ctx = canvas.getContext("2d");
    40. canvas.width = expectWidth;
    41. canvas.height = expectHeight;
    42. ctx.drawImage(this, 0, 0, expectWidth, expectHeight);
    43. alert(canvas.width+','+canvas.height);
    44. var base64 = null;
    45. var mpImg = new MegaPixImage(image);
    46. mpImg.render(canvas, {
    47. maxWidth: 800,
    48. maxHeight: 1200,
    49. quality: 0.8,
    50. orientation: Orientation
    51. });
    52. base64 = canvas.toDataURL("image/jpeg", 0.8);
    53. //uploadImage(base64);
    54. $("#myImage").attr("src", base64);
    55. };
    56. };
    57. oReader.readAsDataURL(file);
    58. }
    59. }
    用到的第三方js文件:mobileBUGFix.mini.js

    测试demo下载地址:
    【html5+exif.js+canvas实现手机端照片上传预览、压缩、旋转功能】 http://download.csdn.net/detail/linlzk/9127441

      推荐阅读