APICloud开发者进阶之路| JS利用H5的canvas操作微信浏览器上传图片方向旋转

Posted API_Cloud

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APICloud开发者进阶之路| JS利用H5的canvas操作微信浏览器上传图片方向旋转相关的知识,希望对你有一定的参考价值。

项目背景:微信公众号,不想用微信JS-SDK  图片上传功能
发现部分机型,微信内置浏览器,vant-upload组件选取图片会发生旋转

解决方案:利用H5的canvas标签操作图片旋转
代码注释不全,大概逻辑就是   选图片 =》读取文件后 =》 判断图片方向 =》用画布重画图片并旋转 =》保存图片文件 
代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <title>图片处理canvas旋转方向</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.9/lib/index.css" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vant@2.9/lib/vant.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/exif-js/2.3.0/exif.js"></script>
    <style type="text/css">
    </style>
  </head>
  <body>
    <div id="app">
      <van-field required :border="false" name="uploader" label="照片">
        <template #input>
          <van-uploader v-model="fileList" :max-count="1" :after-read="afterRead"></van-uploader>
        </template>
      </van-field>
    </div>
  </body>
  <script type="text/javascript">
    new Vue({
      el: ‘#app‘,
      data() {
        return {
          fileList: []
        }
      },
      methods: {
        async afterRead(file) {
          var _this = this; // vue对象
          // file.status = ‘uploading‘;
          // file.message = ‘图片处理‘;
          EXIF.getData(file.file, function() {
            // 旋转方向 1:0° 3:180° 6:顺时针90° 8:逆时针90°
            var Orientation = EXIF.getTag(this, "Orientation");
            var imgName = this.name; // 原图片名称
            var imgType = this.type; // 原图片类型
            if (!this || !window.FileReader) return; // 看支持不支持FileReader
            // 创建一个reader
            var reader = new FileReader();
            // 将图片2将转成 base64 格式
            reader.readAsDataURL(this);
            reader.onloadend = function() {
              var img = new Image();
              img.src = reader.result;
              var width = img.width;
              var height = img.height;
              var canvas = document.createElement(‘canvas‘);
              var ctx = canvas.getContext("2d");
              switch (Number(Orientation)) {
                case 3:
                  canvas.width = width;
                  canvas.height = height;
                  ctx.rotate(Math.PI / 180 * 180);
                  ctx.drawImage(img, 0, 0, img.width, img.height, -img.width, -img.height, img.width, img.height);
                  break;
                case 6:
                  canvas.width = height;
                  canvas.height = width;
                  ctx.rotate(Math.PI / 180 * 90);
                  ctx.drawImage(img, 0, 0, img.width, img.height, 0, -img.height, img.width, img.height);
                  break;
                case 8:
                  canvas.width = height;
                  canvas.height = width;
                  ctx.rotate(Math.PI / 180 * -90);
                  ctx.drawImage(img, 0, 0, img.width, img.height, -img.width, 0, img.width, img.height);
                  break;
                default:
                  canvas.width = width;
                  canvas.height = height;
                  ctx.drawImage(img, 0, 0);
                  break;
              }
              var fileBase64 = canvas.toDataURL(imgType);
              var newFile = _this.dataURLtoFile(imgName, imgType, fileBase64)
              file.content = fileBase64
              file.file = newFile
              file.status = ‘done‘
            }
          });
        },
        dataURLtoFile(imgName, imgType, dataurl) {
          var arr = dataurl.split(","),
            bstr = atob(arr[1]),
            n = bstr.length,
            u8arr = new Uint8Array(n);
          while (n--) {
            u8arr[n] = bstr.charCodeAt(n);
          }
          return new File([u8arr], imgName, {
            type: imgType
          });
        },
      }
    })
  </script>
</html>
复制代码

  

 

以上是关于APICloud开发者进阶之路| JS利用H5的canvas操作微信浏览器上传图片方向旋转的主要内容,如果未能解决你的问题,请参考以下文章

APICloud开发者进阶之路|了解APICloud 应用设计思想

APICloud开发者进阶之路 |iOS修改entitlements文件

APICloud开发者进阶之路 |audioRecorder录音模块Demo

APICloud开发者进阶之路|[ 模块教程 ] UIAlbumBrowser模块效果展示

APICloud开发者进阶之路 | UIPickerView 模块示例demo

APICloud开发者进阶之路 | 超级实用技巧