vue-cropper(图片裁剪插件)

描述:vue-cropper是一个非常好用的图片裁剪插件,可以拿到裁剪后图片的base64地址或者blob地址

一.安装

# npm 安装
npm install vue-cropper
// npm安装或yarn安装,根据喜好2选一即可
# yarn 安装
yarn add vue-cropper

二.引入

  ......
  import {
    
     VueCropper } from 'vue-cropper'
  ......
    export default {
    
    
    components: {
    
    
      VueCropper
      }
    }

三.使用

template中使用 <vue-cropper />并配置一些属性,如下:

 <vue-cropper
    ref="cropper"
    :img="option.img"
    :output-size="option.size"
    :output-type="option.outputType"
    :info="true"
    :full="option.full"
    :can-move="option.canMove"
    :can-move-box="option.canMoveBox"
    :original="option.original"
    :auto-crop="option.autoCrop"
    :fixed="option.fixed"
    :fixed-number="option.fixedNumber"
    :center-box="option.centerBox"
    :info-true="option.infoTrue"
    :fixed-box="option.fixedBox"
 />

在data中配置这些属性,可以根据需要变更

data() {
    
    
      return {
    
    
        option:    {
    
    
          img:         '(此处你可根据你的需求动态获取或固定图片路径)', // 裁剪图片的地址
          info:        true, // 裁剪框的大小信息
          outputSize:  1, // 裁剪生成图片的质量
          outputType:  'jpeg', // 裁剪生成图片的格式
          canScale:    false, // 图片是否允许滚轮缩放
          autoCrop:    true, // 是否默认生成截图框
          fixedBox:    true, // 固定截图框大小 不允许改变
          fixed:       true, // 是否开启截图框宽高固定比例
          fixedNumber: [5, 7], // 截图框的宽高比例
          full:        true, // 是否输出原图比例的截图
          canMoveBox:  false, // 截图框能否拖动
          original:    false, // 上传图片按照原始比例渲染
          centerBox:   false, // 截图框是否被限制在图片里面
          infoTrue:    true // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
        },
      }
    },

获取截图内容
①获取截图的 base64 数据

this.$refs.cropper.getCropData(data => {
    
    
  // do something
  console.log(data)  
})

②获取截图的 blob 数据

this.$refs.cropper.getCropBlob(data => {
    
    
  // do something
  console.log(data)  
})

我在项目中的使用:点击确认按钮后触发submit方法,获取截图的blob地址,再转为file地址后传递给后端服务器,服务器返回在oss上面的地址(就是能拿到一个非本地的图片url,一般可能不需要或者根据要求有别的处理),拿到这个地址后向后端发请求,在服务器保存这个图片。(不同项目使用可能不太相同,但一般应该都需要拿到图片地址上传给后端服务器)

   submit() {
    
    
        this.$refs.cropper.getCropData((dataTemp) => {
    
      // dataTemp保存截图的base64数据
          let file = this.dataURLtoFile(dataTemp, `${
      
      new Date().getTime()}.png`)   // 该方法为自己定义,将base64转为file格式,方便发送给服务器
          let formData = new FormData()   
          formData.append('file', file)
          request.post({
    
       // 向后端发请求
            url:      `此处填写请求的url地址`,
            methods: 'POST',   // 请求方式
            headers: {
    
     'Content-Type': 'application/x-www-form-urlencoded' },   // 请求头
            data:    formData,  //数据通过formData对象传递给后端服务器
          }).then((res) => {
    
    
            const {
    
     server, fileNewName } = res.data.data  // 请求后拿到的数据
            const certificate_url = `${
      
      server}/${
      
      fileNewName}`  // 两者拼接就是服务器返回的图片地址
            this.idPhoto = certificate_url  // idPhoto在data中有给初始值,这里将拿到的地址复制给idPhoto,后面再保存截图后就会在页面显示的图片就绑定这个地址
            const user_id = this.$store.state.user.userId
            // 我这里的操作为向后端发请求在服务器保存截取后的图片,idPhotoApi.idPhotoSave为另一个文件中的方法,如果有需要,可以根据需要发送自己的请求,上传图片。
            idPhotoApi.idPhotoSave({
    
     certificate_url, user_id }).then((res) => {
    
    
              if (res.data.code === '200000') {
    
    
                this.$toast(this.$t('图片上传成功'))
              }
            })
          })
            .catch((error) => this.$toast(error))
        })
        this.show = 3    // 此处是我切换界面的时候用的,data中有定义,一般不需要
      },

	// 将base64转换为文件,dataurl为base64字符串,filename为文件名(必须带后缀名,如.jpg,.png)
	dataURLtoFile (dataurl, filename) {
    
    
  		const arr = dataurl.split(',')
  		const mime = arr[0].match(/:(.*?);/u)[1]
  		const bstr = atob(arr[1])
  		let n = bstr.length
  		const u8arr = new Uint8Array(n)
  		while (n--) {
    
    
    		u8arr[n] = bstr.charCodeAt(n)
  		}
  		const blob = new Blob([u8arr], {
    
     type: mime })
  		return new File([blob], filename, {
    
     type: mime, lastModified: new 		Date() })
	}

猜你喜欢

转载自blog.csdn.net/weixin_52797317/article/details/131073487