需求

运营需要用多张图片进行OCR识别,图片来源一般是运营的截图,直接粘贴过来,然后需求请求OCR截图提交图片list,粘贴图片的同时需要上传图片到cdn地址;

分析

  • 一个输入框(富文本框),这里没有用到富文本本身带的上传图片工具,如有用到直接配置上传图片就可以
  • 需要监听粘贴事件clipboardData
  • 监听粘贴事件上传图片
  • 获取所有粘贴的图片地址请求ocr接口

代码

<div class="ocr-content">
  <quill-editor ref="myQuillEditor" v-model="quillContent" :options="editorOption"></quill-editor>
</div>
data () {
  return {
    quillContent: '',
    editorOption: {
        theme: 'snow', // or 'bubble'
        placeholder: '将图片按Ctrl+V 粘贴至此处',
        modules: {
          clipboard: {
            matchers: [
              ['img', this.handlePasteImg]
            ]
          },
          toolbar: false
        }
      }
  }
},
methods: {
	handlePasteImg(node, delta) {
      let ops = []
      delta.ops.forEach(async (op, index) => {
        if (op.insert && typeof op.insert !== 'string') {  // 如果粘贴了图片,这里会是一个对象
          if (op.insert.image) {
            if (op.insert.image.includes(';base64')) {
              let file = this.dataURLtoFile(op.insert.image, `paste-${Math.random().toString(36).slice(-8)}.jpg`)
              const [res, err] = await apiService.getUploadToken()
              if (err) return false
              // key 值可以自己用当前日期生成
              let key = `page/${getCurrentDate('/')}/${new Date().getTime()}${Math.random().toString(36).slice(-8)}.jpg`
              let origin = res.data.picture.origin
              const fd = new FormData()
              fd.append('key', key)
              fd.append('token', res.data.picture.token)
              fd.append('origin', origin)
              fd.append('time', new Date().getTime())
              fd.append('file', file)
              apiService.uploadImage(fd).then(
                res => {
                  console.log(res, 'res')
                  let quill = this.$refs.myQuillEditor.quill // 获取富文本对象
                  let length = quill.getSelection().index     // 获取编辑器光标位置
                  quill.insertEmbed(length, 'image', `${origin}/${res.key}`) // 插入图片  图片地址
                  quill.setSelection(length + 1)              // 光标后移一位   调整光标到最后
                })
                .catch(err => {
                  console.log(err)
                })
            }
          }
        }
      })
      delta.ops = ops  // 不加会报错
      return delta
    },
    dataURLtoFile(dataurl, name) {
      let arr = dataurl.split(',')
      let mime = arr[0].match(/:(.*?);/)[1]
      let bstr = atob(arr[1])
      let n = bstr.length
      let u8arr = new Uint8Array(n)
      while(n--){
        u8arr[n] = bstr.charCodeAt(n)
      }
      return new File([u8arr], name, {type:mime})
    },
    // 提取富文本中image中的src
    extractImageSrc(htmlString) {
      let imgSrcArray = []
      let imgTagRegex = /<img[^>]+src=['"]([^'"]+)['"][^>]*>/g
      let match
      
      while ((match = imgTagRegex.exec(htmlString)) !== null) {
        let src = match[1]
        imgSrcArray.push(src)
      }
      return imgSrcArray
    },
    // ocr识别
    async handleImageOCR() {
      if (!this.quillContent) {
        this.$Message.error('请上传图片!')
        return false
      }
      let imageList = this.extractImageSrc(this.quillContent)
      if (Array.isArray(imageList) && imageList.length) {
        const [res, err] = await service.ocrResult(imageList)
        if (err) return
        if (res.ok && res.data) {
          this.ocrDescribe = res.data
        } 
      }
    },
}

参考

GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐