zoukankan      html  css  js  c++  java
  • Vue中使用android和ios手机打开相机并选择相册功能和图片旋转问题

    <template>
      <div>
        <input type="file" id="fileElem" accept="image/*" @change="chooseImg" ref="imgFile"/>
      //使用的vant插件
      <van-action-sheet v-model="showCameraSelect" :actions="actions" :cancel-text="'取消'" @cancel="showCameraSelect=false" />
      </div>
    </template>
    <script>
    //cnpm下载exif-js
      import EXIF from "exif-js";
      export default {
        data() {
          return {
          actions:[],
             showCameraSelect: false
          }
        },
        created() {
           this.actions = [{
              name: '相机拍摄',
              model: 'camera'
            },
            {
              name: '选择图片',
              model: 'select'
            }
          ];
        },
         mounted() {
           //判断数组中是否包含某字符串
          Array.prototype.contains = function (needle) {
            for (i in this) {
              if (this[i].indexOf(needle) > 0)
                return i;
            }
            return -1;
          }
          var device_type = navigator.userAgent; //获取userAgent信息
          var md = new MobileDetect(device_type); //初始化mobile-detect
          var os = md.os(); //获取系统
          var model = "";
          if (os == "iOS") { //ios系统的处理
            this.$refs.imgFile.removeAttribute("capture");
          }else{
            let brand = this.phoneBrand()
            if ( brand === 'xiaomi') { // 华为、小米手机:相册选择、拍摄
              this.$refs.imgFile.setAttribute("accept","image/*");
            }else{
              this.$refs.imgFile.setAttribute("capture","user");
            }
          }
        },
        methods: {
      // 获取手机品牌
      phoneBrand() {
        let sUserAgent = navigator.userAgent.toLowerCase()
        let isIphone = sUserAgent.match(/iphone/i) == "iphone";
        let isHuawei = sUserAgent.match(/huawei/i) == "huawei";
        let isHonor = sUserAgent.match(/honor/i) == "honor";
        let isOppo = sUserAgent.match(/oppo/i) == "oppo";
        let isOppoR15 = sUserAgent.match(/pacm00/i) == "pacm00";
        let isVivo = sUserAgent.match(/vivo/i) == "vivo";
        let isXiaomi = sUserAgent.match(/mis/i) == "mi ";
        let isXiaomi2s = sUserAgent.match(/mixs/i) == "mix ";
        let isRedmi = sUserAgent.match(/redmi/i) == "redmi";
        let isSamsung = sUserAgent.match(/sm-/i) == "sm-";
        if (isIphone) {
          return 'iphone';
        } else if (isHuawei || isHonor) {
          return 'huawei';
        } else if (isOppo || isOppoR15) {
          return 'oppo';
        } else if (isVivo) {
          return 'vivo';
        } else if (isXiaomi || isRedmi || isXiaomi2s) {
          return 'xiaomi';
        } else if (isSamsung) {
          return 'samsung';
        } else {
          return 'default';
        }
      }
          // 触发拍摄
          shootStart() {
            setTimeout(()=>{
              let fileElem = document.getElementById("fileElem");
              let brand = this.phoneBrand()
              if ( brand === 'xiaomi' || brand === 'huawei') { // 华为、小米手机:相册选择、拍摄
              this.$dialog.confirm({
                message: '如果您的手机不支持拍摄上传照片,请从本地相册上传',
                showCancelButton: false,
                confirmButtonText:'确定'
              }).then(() => {
                // fileElem.removeAttribute('capture');
                this.$nextTick(()=>{
                  //触发点击事件
                  let event = document.createEvent("MouseEvents");
                  event.initEvent("click", true, true);
                  document.getElementById("fileElem").dispatchEvent(event);
                })
              })
              }else { // 非小米:前置摄像头拍摄
              this.$nextTick(()=>{
                let event = document.createEvent("MouseEvents");
                event.initEvent("click", true, true);
                document.getElementById("fileElem").dispatchEvent(event);
              })
              }
            }, 100)
          },
          //选择图片/拍摄照片
          chooseImg(e) {
            let files = e.target.files || e.dataTransfer.files;
            if (!files.length) return;
        this.imgPreview(files[0]);
          },
          // 预览图片
          imgPreview(file, isRepeat) {
            let that = this;
            if (file) {
              let Orientation;
              EXIF.getData(file, function() {
                EXIF.getAllTags(this);
                Orientation = EXIF.getTag(this, 'Orientation');
                let reader = new FileReader();
                reader.readAsDataURL(file);
                reader.onload = function(ev) {
                  const quality = 0.95; //图像质量
                  let image = new Image();
                  let canvas = document.createElement('canvas'),
                      ctx = canvas.getContext('2d');
                  /* 旋转绘制 */
                  let rotateImage = function(img, dir, canvas, s) {
                    dir = dir || 'right';
                    s = s || 1;
                    let MIN_STEP = 0,
                        MAX_STEP = 3,
                        width = canvas.width || img.width,
                        height = canvas.height || img.height,
                        step = 0;
                    if (dir === 'right') {
                      step += s;
                      step > MAX_STEP && (step = MIN_STEP);
                    } else {
                      step -= s;
                      step < MIN_STEP && (step = MAX_STEP);
                    }
                    let degree = step * 90 * Math.PI / 180;
                    switch (step) {
                      case 1:
                        canvas.width = height;
                        canvas.height = width;
                        ctx.rotate(degree);
                        ctx.drawImage(img, 0, -height, width, height);
                        break;
                      case 2:
                        canvas.width = width;
                        canvas.height = height;
                        ctx.rotate(degree);
                        ctx.drawImage(img, -width, -height, width, height);
                        break;
                      case 3:
                        canvas.width = height;
                        canvas.height = width;
                        ctx.rotate(degree);
                        ctx.drawImage(img, -width, 0, width, height);
                        break;
                      default:
                        canvas.width = width;
                        canvas.height = height;
                        ctx.drawImage(img, 0, 0, width, height);
                        break;
                    }
                  };
                  /* 绘制 */
                  let draw = function() {
                    /* 图片原始大小 */
                    let width = image.width,
                        height = image.height;
                    /* 图片尺寸缩放比 800 为基数 */
                    if (width > 3200 || height > 3200) {
                      width = Math.floor(width / 4);
                      height = Math.floor(height / 4);
                    } else if (width > 2400 || height > 2400) {
                      width = Math.floor(width / 3);
                      height = Math.floor(height / 3);
                    } else if (width > 1600 || height > 1600) {
                      width = Math.floor(width / 2);
                      height = Math.floor(height / 2);
                    }
                    canvas.width = width;
                    canvas.height = height;
                    /*canvas清屏*/
                    ctx.clearRect(0, 0, canvas.width, canvas.height);
                    if (Orientation && Orientation !== 1) {
                      switch (Orientation) {
                        case 6:
                          /* 顺时针旋转90度 */
                          rotateImage(image, 'right', canvas);
                          break;
                        case 8:
                          /* 逆时针旋转90度 */
                          rotateImage(image, 'left', canvas);
                          break;
                        case 3:
                          /* 顺时针旋转180度 */
                          rotateImage(image, 'right', canvas, 2);
                          break;
                        default:
                          break;
                      }
                    }else {
                      ctx.drawImage(image, 0, 0, width, height);
                    }
                    //第一个参数为图片类型,如image/jpeg, image/png, image/gif;第二个参数为图片质量(针对image/jpeg、image/webp)
                    let dataURI = canvas.toDataURL("image/jpeg", quality);
                    that.validSize(file.name, dataURI);
                  };
                  /* 图像加载完成 */
                  image.onload = function() {
                    draw();
                  }
                  image.src = ev.target.result
                }
              });
            }
          },
        }
      }
    </script>
    <style scoped>
      
    </style>
  • 相关阅读:
    一个创业成功者原始资本的快速积累
    个性创业先要聚人气才能赚大钱
    26个字母——女性必读
    100个成功创业经验方法谈
    从老板身上偷学的东西,你能吗?
    18岁29岁创业者的“黄金线” 要把握
    数禾云上数据湖最佳实践
    如何做好技术 Team Leader?
    闲鱼是怎么让二手属性抽取准确率达到95%+的?
    解读:云原生下的可观察性发展方向
  • 原文地址:https://www.cnblogs.com/xiaofang234/p/14926030.html
Copyright © 2011-2022 走看看