Newer
Older
smartwell_app_front / src / components / plus / camera / Camera.vue
StephanieGitHub on 6 Aug 2019 5 KB first commit
<template>
  <transition name="slide">
    <div class="camera">
      <mt-header class="header" title="camera" :fixed="headerConf.fixed">
        <div slot="left">
          <mt-button icon="back" @click="back">返回</mt-button>
        </div>
      </mt-header>
      <div class="content">
        <mt-actionsheet
          :actions="actionsheetConf.arr"
          :cancelText="actionsheetConf.cancelText"
          :closeOnClickModal="actionsheetConf.closeOnClickModal"
          v-model="actionsheetConf.flag"
        >
        </mt-actionsheet>
        <div class="row">
          <h3>拍照需要build或者打成包之后方可看见效果</h3>
        </div>
        <mt-button type="default" @click="toast('top')">选取照片</mt-button>
        <!--<mt-cell title="jump" label="Camera,相册与拍照" is-link to="/plus/test"></mt-cell>-->
        <div class="photo" id="photo" v-show="photoInfo.flag">
          <img :src="photoInfo.path" alt=""/>
        </div>
      </div>
    </div>
  </transition>
</template>

<script>
  import { Toast, Button, Actionsheet, Indicator } from 'mint-ui'
  import { headerMixin } from 'assets/js/mixins'

  export default {
    mixins: [headerMixin],
    data () {
      return {
        actionsheetConf: {
          flag: false,  // 显隐控制
          arr: [  // 内容数组
            {
              name: '拍照',
              method: this.picture
            },
            {
              name: '从相册中选取',
              method: this.album
            }
          ],
          cancelText: '取消按钮', // 取消按钮
          closeOnClickModal: true, // 是否可以点击遮罩取消
        },
        photoInfo: {
          path: '',
          flag: false
        }
      }
    },
    methods: {
      toast () {
        this.actionsheetConf.flag = true
      },
      picture () {
        Indicator.open({
          text: '获取中...',
          spinnerType: 'triple-bounce'
        })
        let self = this
        let cmr = plus.camera.getCamera();
        let res = cmr.supportedImageResolutions[0]; //支持照片的分辨率
        let fmt = cmr.supportedImageFormats[0]; //照片的格式
        cmr.captureImage(function (path) {
          console.log("Capture image success: " + path);
          self.compressPhoto(path); // 压缩并写入图片
        }, function (error) {
          console.log("picture error " + JSON.stringify(error))
          Indicator.close()
        }, {
          resolution: res,
          format: fmt
        });
      },
      album () {
        let self = this
        Indicator.open({
          text: '获取中...',
          spinnerType: 'triple-bounce'
        })
        // 从相册中选择图片
        console.log("从相册中选择图片:");
        plus.gallery.pick(function (path) {
          console.log(path);
          self.compressPhoto(path); // 压缩并写入图片
        }, function (e) {
          console.log("取消选择图片 " + JSON.stringify(e));
          Indicator.close()
        }, {
          filter: "image"
        });
      },
      compressPhoto (path) {
        let self = this
        plus.io.resolveLocalFileSystemURL(path, function (entry) {
          let src = entry.toLocalURL();
          console.log("src " + src);
          let random = Date.parse(new Date());
          /*压缩图片*/
          plus.zip.compressImage({
            src: src,
            dst: "_doc/signature_" + random + ".jpg",
            overwrite: true, //是否覆盖源文件
            quality: 100,
            width: "300px",
            height: "360px"
          }, function (zip) {
            Indicator.close()
            let size = zip.size;
            console.log("filesize:" + zip.size + ",totalsize:" + size);
            if (size > (10 * 1024 * 1024)) {
              Toast({
                message: '照片大小超出限制',
                position: 'bottom',
                duration: 3000
              })
              return
            }
            self.photoInfo.path = zip.target  // 赋值照片文件路径
            self.photoInfo.flag = true
            console.log("文件路径 " + self.photoInfo.path)
          }, function (zipe) {
            Indicator.close()
            Toast({
              message: '照片压缩失败',
              position: 'bottom',
              duration: 3000
            });
          });
        });
      }
    }
  }
</script>

<style scoped lang="stylus" rel="stylesheet/stylus">
  @import "~assets/css/variable.styl"
  @import "~assets/css/transition.styl"
  .camera {
    position absolute
    z-index 100
    top 0
    left 0
    right 0
    bottom 0
    background-color $color-background
    .content {
      padding-top 50px
      .row {
        height 50px
        line-height 50px
        text-align center
      }
      button.mint-button--default {
        display block
        width 60%
        height 40px
        margin 20px auto
        box-shadow 0 0 2px #b8bbbf
      }
      .photo {
        width 85%
        margin 0 auto
        img {
          width 100%
        }
      }
    }
  }
</style>