Vue中使用android和ios手机打开相机并选择相册功能和图片旋转问题

vue

<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(/mi\s/i) == "mi ";

    let isXiaomi2s = sUserAgent.match(/mix\s/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>

以上是 Vue中使用android和ios手机打开相机并选择相册功能和图片旋转问题 的全部内容, 来源链接: utcz.com/z/375868.html

回到顶部