在视频中选定/截取部分区域画面,然后将左上角坐标百分比和选定区域宽高所占百分比传给后端

这篇具有很好参考价值的文章主要介绍了在视频中选定/截取部分区域画面,然后将左上角坐标百分比和选定区域宽高所占百分比传给后端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 需求描述

在视频中选定部分区域,然后将左上角坐标百分比和选定区域宽高所占百分比传给后端

2. 实现思路

  1. 播放 flv 格式视频
  2. 点击“截取”按钮,将视频当前画面截取为一张图片并回显图片,
  3. 使用 Cropper 插件截取图片部分区域(可以获取到截取图片左上角点坐标和截取部分的宽高)

3. 效果图展示

在视频中选定/截取部分区域画面,然后将左上角坐标百分比和选定区域宽高所占百分比传给后端

在视频中选定/截取部分区域画面,然后将左上角坐标百分比和选定区域宽高所占百分比传给后端

4. 代码

<!-- 标定识别区域 -->
<template>
  <el-dialog
    title="标定识别区域"
    :visible.sync="dialogVisible"
    width="50%"
    @close="closeHandler"
    append-to-body
    :close-on-click-modal="false"
  >
    <video
      v-show="!imgSrc.length"
      id="videoElement"
      class="video-component"
      ref="videoElement"
      controls
      muted
    >
      不支持
    </video>
    <div v-if="!!imgSrc.length" class="imgBox">
      <img id="image" :src="imgSrc" alt="" />
    </div>

    <div class="btns">
      <el-button :disabled="!!imgSrc.length" type="primary" size="mini" @click="interceptHandler">
        截图
      </el-button>
      <el-button :disabled="!imgSrc.length" type="primary" size="mini" @click="imgSrc = ''">
        重新截图
      </el-button>
      <el-button :disabled="!imgSrc.length" type="primary" size="mini" @click="sureHandler">
        确定
      </el-button>
    </div>
  </el-dialog>
</template>

<script>
import flvjs from 'flv.js' // 用来处理 flv 格式视频
import html2canvas from 'html2canvas' // 用来截取视频当前画面为图片
import Cropper from 'cropperjs' // 截取图片部分区域工具
import 'cropperjs/dist/cropper.css' // 截取图片部分区域工具样式
import { updateRectf } from '@/api/video-intelligent-analysis.js' // 给后端传参接口

export default {
  name: 'SignAreaDialog',
  components: {},

  data() {
    return {
      dialogVisible: false,
      imgSrc: '', // 图片地址
      screenshotInfo: {
        // 裁剪信息
        x: 0, // 左上角点x轴坐标
        y: 0, // 左上角点y轴坐标
        width: 0, // 图片截取部分宽
        height: 0 // 图片截取部分高
      },
      rowData: {}, // 给后端接口传参时用到其中参数
      pRowData: {} // 给后端接口传参时用到其中参数
    }
  },

  computed: {},

  watch: {
    imgSrc: {
      handler(val) {
        let _this = this
        setTimeout(() => {
          if (!val) return

          /**** 【3】有图片 - 图片部分设定裁剪框 - 使用Cropper工具截取图片 ****/
          const image = document.getElementById('image')
          const cropper = new Cropper(image, {
            // aspectRatio: 839 / 473,
            // autoCropArea: 1, // 设置裁剪区域占图片的大小 值为 0-1 默认 0.8 表示 80%的区域
            // viewMode: 3, // 视图控制: 0 无限制;1 限制裁剪框不能超出图片的范围;2 限制裁剪框不能超出图片的范围 且图片填充模式为 cover 最长边填充;3 限制裁剪框不能超出图片的范围 且图片填充模式为 contain 最短边填充
            scalable: false, // 是否可以缩放图片(可以改变长宽) 默认true
            zoomable: false, // 是否可以缩放图片(改变焦距) 默认true
            zoomOnWheel: false, // 是否可以通过鼠标滚轮缩放图片 默认true
            crop(event) {
              Object.keys(_this.screenshotInfo).forEach((key) => {
                // 获取截取部分信息(event.detail中有左上角坐标、宽、高等属性)
                _this.screenshotInfo[key] = event.detail[key] < 0 ? 0 : event.detail[key]
              })

              // _this.screenshotInfo = event.detail
            }
          })
        }, 50)
      },
      deep: true,
      immediate: true
    }
  },

  mounted() {},

  created() {},

  methods: {
    open(type, rowData, pRowData, videoUrl) {
      this.rowData = rowData
      this.pRowData = pRowData

      // 用 setTimeout 延迟一下,否则获取不到 dom
      setTimeout(() => {
        /**** 【1】播放 flv 格式视频 ****/
        if (flvjs.isSupported()) {
          var videoElement = document.getElementById('videoElement')
          var flvPlayer = flvjs.createPlayer({
            type: 'flv',
            isLive: true,
            // url: 'ws://192.168.11.169:8866/live?url=D:/xgplayer-demo-720p.flv' // flv 视频地址
            url: videoUrl // flv 视频地址
          })
          flvPlayer.attachMediaElement(videoElement) // 获取不到 dom 的话这里会报错,使用延时器延时一下就好了
          flvPlayer.load()
          flvPlayer.play()
        }
      }, 50)

      this.dialogVisible = true
    },

    /**** 【2】点击“截取”按钮,将视频当前画面截取为一张图片 并 显示出来 ****/
    interceptHandler(event, ownerInstance) {
      html2canvas(document.getElementById('videoElement'), {
        backgroundColor: null,
        useCORS: true // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
      }).then((canvas) => {
        let url = canvas.toDataURL('image/png')
        this.imgSrc = url
      })
    },

    sureHandler() {
      const container = document.querySelector('.cropper-container')
      const containerWidth = container.offsetWidth
      const containerHeight = container.offsetHeight

      let params = {
        sfbh: this.pRowData.id,
        znfxbh: this.rowData.znfxbh,
        // *1 是为了确保是数字之间进行运算,避免运算结果为 NAN
        rectfX: (((this.screenshotInfo.x * 1) / containerWidth) * 1).toFixed(7) * 1, // 识别区域 X 轴位置 百分比
        rectfY: (((this.screenshotInfo.y * 1) / containerHeight) * 1).toFixed(7) * 1, // 识别区域 Y 轴位置 百分比
        rectfW: (((this.screenshotInfo.width * 1) / containerWidth) * 1).toFixed(7) * 1, // 识别区域宽度百分比
        rectfH: (((this.screenshotInfo.height * 1) / containerHeight) * 1).toFixed(7) * 1 // 识别区域高度百分比
      }
      for (let key in params) {
        if (params[key] > 1) params[key] = 1
      }
      // return
      updateRectf(params).then((res) => {
        this.$common.CheckCode(res, '标定成功', () => {
          this.dialogVisible = false
          this.$emit('update')
        })
      })
    },

    closeHandler() {
      this.imgSrc = ''
      document.getElementById('videoElement').pause() // 暂停视频播放
      for (let key in this.screenshotInfo) {
        this.screenshotInfo[key] = 0
      }
    }
  }
}
</script>

<style lang='scss' scoped>
::v-deep .el-dialog__body {
  // display: flex;
  // justify-content: center;
  padding: 20px !important;
}
#videoElement {
  width: 100%;
}
// ::v-deep .cropper-bg {
//   width: 100% !important;
// }

.btns {
  margin-top: 10px;
  text-align: right;
}
</style>

cropperjs 参数配置文档
cropperjs npm官方地址 文章来源地址https://www.toymoban.com/news/detail-435482.html

到了这里,关于在视频中选定/截取部分区域画面,然后将左上角坐标百分比和选定区域宽高所占百分比传给后端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【已解决】微信小程序消除/去掉/隐藏左上角返回按钮

    首先要明确的是页面间的跳转方式有几种、每一种默认的作用是什么。 跳转方式: 第一:wx.navigatorTo 【新页面打开,默认会有返回按钮】 第二:wx.redirectTo【当前页面打开,默认无返回按钮】 第三:wx.switchTab【只能用于跳转到tabbar页面,并关闭其他非tabbar页面,tabbar之间做切

    2024年02月13日
    浏览(57)
  • Js使用ffmpeg进行视频剪辑和画面截取

    使用场景是需要在web端进行视频的裁剪,包括使用 在线视频url 或 本地视频文件 的裁剪,以及对视频内容的截取等功能。 前端进行视频操作可能会导致性能下降,最好通过后端使用java,c++进行处理,本文的案例是备选方案。 注意: 以下所有的使用案例均基于vue3 setup。 同时

    2024年02月07日
    浏览(39)
  • 微信小程序扫一扫左上角按钮返回指定页面

           微信小程序官方文档中有两个参数,success就是正常扫一扫之后要执行的操作,如果进入到扫一扫页面想要点击左上角返回指定页面,可以在fail中书写页面跳转。  

    2024年02月16日
    浏览(60)
  • Ubuntu22.04开机左上角下划线闪烁不开机

    按下Ctrl+Alt+F2,打开TTY系统,然后通过用户名和密码登录,随后使用 根据提示排除错误信息,然后使用apt安装lightdm安装就行。 tips:当使用EasyConnect的时候,你可能参考了下面这篇文章 知乎文章 https://zhuanlan.zhihu.com/p/346325399 也就是说,你安装了libpango-1.0-0、libpangocairo-1.0-0和l

    2024年01月25日
    浏览(56)
  • 如何解决kali开机后黑屏AND光标一直在左上角

    这个问题整的我很尴尬·····哎,早上起来开机后发现进入不了图形化界面,我的心慌了10秒。随后冷静下来,想了一下昨晚上关机是正常的关机,也不会存在在更新状态下非正常断电情况。整理了一下思路,并没有什么卵用,只能一步步的排错。 一、 首先 开机后出现黑屏

    2024年02月09日
    浏览(73)
  • uni-app微信小程序隐藏左上角返回按钮

    官方文档链接:uni.setNavigationBarTitle(OBJECT) | uni-app官网 (dcloud.net.cn) 首先要明确的是页面间的跳转方式有几种、每一种默认的作用是什么。  uniapp五种跳转方式  使用2、4种跳转方式使用;

    2024年04月26日
    浏览(57)
  • Ubuntu开机黑屏/左上角光标闪烁/登陆界面进入后黑屏

    实验室服务器老毛病,两台服务器都出问题: 1、一台开机没有图形界面,开机后黑屏,左上角一个光标闪烁,一直停留在这个界面。 2、另外一台开机后能进到登陆界面,输入密码以后直接黑屏不显示; 以上两个问题在查阅相关博客发现应该是图形界面顺坏,但尝试博客提

    2024年02月06日
    浏览(55)
  • css实现卡片的左上角有一个三角形的遮盖效果

    需求: 卡片的左上角有一个绿色的三角形标签,用来区分状态 实现:

    2024年02月14日
    浏览(56)
  • 用Python+OpenCV截取视频中所有含有字幕的画面

    有的视频文件的字幕已经压制到了 视频的图像中 ,不能单独提取出字幕文件。网上的 “提取视频字幕” 网站多为提取视频中的字幕文件,而非识别视频 图像中 的字幕。少数通过OCR技术识别画面中字幕的工具需要在线运行、运行速度较慢,或者需要收费,使用不够灵活。

    2024年04月10日
    浏览(41)
  • canvas截取多个视频的第一帧,第n秒画面

    业务涉及视频预览,不点击视频则不播放而是先展示视频的画面给到用户 “因为本人特别喜欢梅艳芳,所以也留存了很多她的视频,这里就以她的视频做测试了” 截取多个视频的第一帧,使用:Promise+loadeddata事件+canvas Promise来帮助我们顺序地拿到多个视频的第一帧画面 loa

    2023年04月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包