手写视频裁剪框

在这里插入图片描述

     <!-- 截取框 --><divv-show="isShow"class="crop-box":style="{width: cropWidth + 'px',height: cropHeight + 'px',left: cropX + 'px',top: cropY + 'px',}"ref="cropBox"@mousedown="startInteraction"><!-- 内容在这里 --><div class="crop-box-content"></div><div@mousedown="dd"data-v-23936b6b=""data-action="se"class="east-south-side"></div></div>

js

  startInteraction(e) {const box = this.$refs.cropBox;const boxRect = box.getBoundingClientRect();const mouseX = e.clientX - boxRect.left;const mouseY = e.clientY - boxRect.top;if (mouseX <= this.resizeHandleSize && mouseY <= this.resizeHandleSize) {this.resizeDirection = "tl";} else if (mouseX >= boxRect.width - this.resizeHandleSize &&mouseY <= this.resizeHandleSize) {this.resizeDirection = "tr";} else if (mouseX >= boxRect.width - this.resizeHandleSize - 20 &&mouseY >= boxRect.height - this.resizeHandleSize - 20) {this.resizeDirection = "br";} else if (mouseX <= this.resizeHandleSize &&mouseY >= boxRect.height - this.resizeHandleSize) {this.resizeDirection = "bl";} else {this.resizeDirection = null;this.startDragging(e);return;}this.startX = e.clientX;this.startY = e.clientY;this.startWidth = this.cropWidth;this.startHeight = this.cropHeight;this.startCropX = this.cropX;this.startCropY = this.cropY;this.isResizing = true;document.addEventListener("mousemove", this.handleResize);document.addEventListener("mouseup", this.stopInteraction);},startDragging(e) {this.startX = e.clientX;this.startY = e.clientY;this.startCropX = this.cropX;this.startCropY = this.cropY;this.isDragging = true;document.addEventListener("mousemove", this.handleDrag);document.addEventListener("mouseup", this.stopInteraction);},handleResize(e) {if (this.isResizing) {const deltaX = e.clientX - this.startX;const deltaY = e.clientY - this.startY;let newWidth, newHeight;switch (this.resizeDirection) {case "tl":return;newWidth = this.startWidth - deltaX;newHeight = this.calculateHeight(newWidth);this.cropX = this.startCropX + deltaX;this.cropY = this.startCropY + deltaY;break;case "tr":return;newWidth = this.startWidth + deltaX;newHeight = this.calculateHeight(newWidth);this.cropY = this.startCropY + deltaY;break;case "br":newWidth = this.startWidth + deltaX;// newHeight = this.calculateHeight(newWidth);newHeight = (newWidth * 16) / 9;break;case "bl":return;newWidth = this.startWidth - deltaX;newHeight = this.calculateHeight(newWidth);this.cropX = this.startCropX + deltaX;break;default:break;}this.cropWidth = Math.max(newWidth, 50); // 最小宽度this.cropHeight = Math.max(newHeight, 50); // 最小高度// 检查是否超出父容器范围const cropper = this.$refs.videoAndCropper;// console.log(// "🚀 ~ file: index02.vue:1687 ~ handleResize ~ cropper:",// cropper.offsetHeight// );const parentRect = this.$el.getBoundingClientRect();// // console.log("🚀 ~ file: index02.vue:1687 ~ handleResize ~ parentRect:", parentRect)if (this.cropY + this.cropHeight > cropper.offsetHeight) {this.cropHeight = cropper.offsetHeight;}if (this.cropHeight == cropper.offsetHeight) {this.cropWidth = (this.cropHeight / 16) * 9;}//  if (this.cropX + this.cropWidth > parentRect.width) {//   this.cropWidth = parentRect.width - this.cropX;// }}},handleDrag(e) {// 通过$refs获取元素引用const element = this.$refs.videoAndCropper;// 获取元素的高度和宽度const height = element.clientHeight; // 获取元素内部高度,包括内边距,不包括边框const width = element.clientWidth; // 获取元素内部宽度,包括内边距,不包括边框if (this.isDragging) {const deltaX = e.clientX - this.startX;const deltaY = e.clientY - this.startY;// 计算新的位置const newCropX = this.startCropX + deltaX;const newCropY = this.startCropY + deltaY;// console.log(// "🚀 ~ file: index02.vue:1677 ~ handleDrag ~ newCropY:",// newCropY + this.cropHeight// );// 检查是否超出父容器范围const parentRect = this.$el.getBoundingClientRect();// console.log(// "🚀 ~ file: index02.vue:1651 ~ handleResize ~ parentRect:",// parentRect// );// console.log(// "🚀 ~ file: index02.vue:1694 ~ handleDrag ~ height:",// height// );if (newCropX >= 0 && newCropX + this.cropWidth <= parentRect.width) {this.cropX = newCropX;}if (newCropY >= 0 && newCropY + this.cropHeight <= parentRect.height) {this.cropY = newCropY;}//    if (newCropY + this.cropHeight >= height) {//     console.log(3333);//   return;// }if (newCropX + this.cropWidth >= width) {this.cropX = width - this.cropWidth;}if (newCropY + this.cropHeight >= height) {this.cropY = height - this.cropHeight;}}},stopInteraction() {this.isResizing = false;this.isDragging = false;this.resizeDirection = null;document.removeEventListener("mousemove", this.handleResize);document.removeEventListener("mousemove", this.handleDrag);document.removeEventListener("mouseup", this.stopInteraction);},

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

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

相关文章

【AI视野·今日CV 计算机视觉论文速览 第280期】Mon, 1 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Mon, 1 Jan 2024 Totally 46 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning Vision from Models Rivals Learning Vision from Data Authors Yonglong Tian, Lijie Fan, Kaifeng Chen, Dina K…

二、类与对象(四)

22 内部类 22.1 内部类的概念 如果一个类定义在另一个类的内部&#xff0c;这个类就叫做内部类。内部类是一个独立的类&#xff0c;它不属于外部类&#xff0c;更不能通过外部类的对象去访问内部类的成员&#xff0c;外部类对内部类没有任何优越的访问权限&#xff0c;也就是…

LINUX基础培训之开机启动过程

前言、本章学习目标 掌握系统启动、引导过程 了解grub.conf的参数设置 熟悉系统运行级别 了解加载内核过程 一、LINUX启动引导过程 Linux系统的启动过程并不是大家想象中的那么复杂&#xff0c;其过程可以分为5个阶段&#xff1a; 1.开机自检 服务器主机开机以后&#xf…

Spring Beans的魔法门:解密多种配置方式【beans 四】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Spring Beans的魔法门&#xff1a;解密多种配置方式【beans 四】 前言XML配置方式1. 声明和配置Bean&#xff1a;2. 构造函数注入&#xff1a;3. 导入其他配置文件&#xff1a; java注解方式1. 使用Co…

算法训练营Day35

#Java #动态规划 开源学习资料 Feeling and experiences&#xff1a; 不同路径&#xff1a;力扣题目链接 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右…

MyBatisPlus学习三:Service接口、代码生成器

学习教程 黑马程序员最新MybatisPlus全套视频教程&#xff0c;4小时快速精通mybatis-plus框架 Service接口 简介 在MyBatis-Plus框架中&#xff0c;Service接口的作用是为实体类提供一系列的通用CRUD&#xff08;增删改查&#xff09;操作方法。通常情况下&#xff0c;Servi…

PyTorch 入门学习数据操作之创建

简介 在深度学习中&#xff0c;我们通常会频繁地对数据进行操作&#xff1b;要操作一般就需要先创建。 官方介绍 The torch package contains data structures for multi-dimensional tensors and defines mathematical operations over these tensors. Additionally, it pr…

SpringMVC通用后台管理系统源码

整体的SSM后台管理框架功能已经初具雏形&#xff0c;前端界面风格采用了结构简单、 性能优良、页面美观大的Layui页面展示框架 数据库支持了SQLserver,只需修改配置文件即可实现数据库之间的转换。 系统工具中加入了定时任务管理和cron生成器&#xff0c;轻松实现系统调度问…

【源码解析】Apache RocketMQ发送消息源码

send message源码解析 引入 send message方法作为我们经常使用的方法&#xff0c;平时我们很难去关注他底层到底做了什么。大部分人只知道通过send message方法可以将消息发送到broker&#xff0c;然后供消费者进行消费。其实不然&#xff0c;消息从客户端发送到broker&#x…

ssm基于vue.js的购物商场的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装购物商场软件来发挥其高效地信息处理的作用&#xff0c;可以…

cissp 第10章 : 物理安全要求

10.1 站点与设施设计的安全原则 物理控制是安全防护的第一条防线&#xff0c;而人员是最后一道防线。 10.1.1 安全设施计划 安全设施计划通过关键路径分析完成。 关键路径分析用于找出关键应用、流程、运营以及所有必要支撑元索间的关系。 技术融合指的是各种技术、解决方案…

性能优化-OpenMP基础教程(三)

本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &…

书生·浦语大模型全链路开源体系 学习笔记 第一课

背景 大模型是发展人工通用人工智能的一个重要途径&#xff0c;能够解决多种任务和多种模态&#xff0c;展示了一个更面向更高阶的智能的潜在途径。大模型的发展历程是从专用模型到通用模型的过程&#xff0c;从语音识别、图像识别、人脸识别等专用模型&#xff0c;到通用的大…

Java8内置四大核心函数式接口

先来看几个例子,主要练习策略模式: 用策略模式的做法 定义个接口 其实像这样的接口并不需要我们自己创建 java8推出的Lambda表达式主要就是为了简化开发,而Lambda表达式 的应用主要是针对与函数式接口,自然也推出了对应的一些接口 /*** Java8 内置的四大核心函数式接口** C…

【C++】STL 算法 ③ ( 函数对象中存储状态 | 函数对象作为参数传递时值传递问题 | for_each 算法的 函数对象 参数是值传递 )

文章目录 一、函数对象中存储状态1、函数对象中存储状态简介2、示例分析 二、函数对象作为参数传递时值传递问题1、for_each 算法的 函数对象 参数是值传递2、代码示例 - for_each 函数的 函数对象 参数在外部不保留状态3、代码示例 - for_each 函数的 函数对象 返回值 一、函数…

权威认可!甄知科技猪齿鱼产品荣获信创产品评估证书

近日&#xff0c;依据《信息技术应用创新产品评估规范 第1部分&#xff1a;应用软件》&#xff08;T/SSIA 2001-2022&#xff09;&#xff0c;经过严格评估&#xff0c;甄知科技旗下自主研发的猪齿鱼数智化开发管理平台 V2.0.0&#xff0c;通过信创测试认证&#xff0c;获得上海…

差分约束算法

差分约束 差分约束系统包含 m m m个涉及 n n n个变量的差额限制条件&#xff0c;这些差额限制条件每个都是形式为 x i − x j ≤ b ∈ [ 1 , m ] x_i-x_j\leq b_{\in[1,m]} xi​−xj​≤b∈[1,m]​的简单线性不等式。 通常我们要求解出一组可行解。 最短路差分约束 如果我们…

ubuntu 22 virt-manger(kvm)安装winxp; ubuntu22体验 firebird3.0

安装 、启动 virt-manager sudo apt install virt-manager sudo systemctl start libvirtdsudo virt-manager安装windowsXP 安装过程截图如下 要点1 启用 “包括寿终正寝的操作系统” win_xp.iso 安装过程 &#xff1a; 从winXp.iso启动, 执行完自己重启从硬盘重启&#xff0c…

稿件代写3个不可或缺的步骤让你事半功倍-华媒舍

作为一个需求频繁的作者&#xff0c;你可能会面临大量的稿件代写任务。但是&#xff0c;你是否曾经为提高文章质量而苦恼过&#xff1f;是否希望在有限的时间内完成更多的代写任务&#xff1f;本篇文章将向你介绍三个不可或缺的稿件代写步骤&#xff0c;帮助你事半功倍&#xf…

Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

Redis的慢查询 许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似…