手写视频裁剪框

在这里插入图片描述

     <!-- 截取框 --><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.hqwc.cn/news/327080.html

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

相关文章

数据库选择题 (期末复习)

数据库第一章 概论简答题 数据库第二章 关系数据库简答题 数据库第三章 SQL简答题 数据库第四第五章 安全性和完整性简答题 数据库第七章 数据库设计简答题 数据库第九章 查询处理和优化简答题 数据库第十第十一章 恢复和并发简答题 2015期末 1、在数据库中&#xff0c;下列说…

分布式(6)

目录 26.雪花算法如何实现的&#xff1f; 27.雪花算法有什么问题&#xff1f;有哪些解决思路&#xff1f; 28.有哪些方案实现分布式锁&#xff1f; 29.基于数据库如何实现分布式锁&#xff1f;有什么缺陷&#xff1f; 30.基于Redis如何实现分布式锁&#xff1f;有什么缺陷&…

Unix操作系统的前世今生

Unix是一种多用户、多任务操作系统&#xff0c;最初由AT&T贝尔实验室的肯汤普逊&#xff08;Ken Thompson&#xff09;和丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;等人开发于上世纪70年代初。它被设计成一种通用的操作系统&#xff0c;支持跨多种硬件平台&#xf…

吉时利2601A数字源表Keithley 2601A

吉时利2601A源测量单元&#xff08;SMU&#xff09;&#xff0c;也被称为源表&#xff0c;是一种高性能的仪器&#xff0c;能够提供100毫伏至40伏的电压范围&#xff0c;以及100纳至10安的电流范围。这种仪器能够提供的功率高达40.4瓦&#xff0c;使其在台式I-V表征工具或多通道…

C语言学习NO.11-字符函数strlen,strlen函数的使用,与三种strlen函数的模拟实现

&#xff08;一&#xff09;strlen函数的使用 strlen函数的演示 #include <stdio.h> #include <string.h>int main() {char arr1[] "abcdef";char arr2[] "good";printf("arr1 %d,arr2 %d",strlen(arr1),strlen(arr2));return …

Linux第11步_解决“挂载后的U盘出现中文乱码”

学习完“通过终端挂载和卸载U盘”&#xff0c;我们发现U盘下的中文文件名会出现乱码&#xff0c;现在讲解怎么解决这个问题。其实就是复习一下“通过终端挂载和卸载U盘”&#xff0c;单独讲解&#xff0c;是为了解决问题&#xff0c;一次性搞好&#xff0c;我们会不长记性。 在…

手势识别+人脸识别+姿态估计(关键点检测+教程+代码)

手势识别和手势关键点检测是计算机视觉领域中的一个重要研究方向,涉及到从图像或视频中检测人手的位置和姿态信息,并推断出手势的意义。以下是一些可能用到的方法和技术: 手势识别 基于深度学习的手势识别 基于深度学习的手势识别是目前最流行的方法之一。它通常使用卷积神…

Zookeeper注册中心实战

Java学习手册面试指南&#xff1a;https://javaxiaobear.cn Spring Cloud Zookeeper通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法&#xff0c;为 Spring Boot 应用程序提供Apache Zookeeper集成。通过一些简单的注释&#xff0c;您可以快速启用和配置应用…

目标检测 | YOLOv5 训练自标注数据集实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要了解 YOLOv5 训练自标注数据集&#xff08;自行车和摩托车两种图像&#xff09;进行目标检测&#xff0c;实现迁移学习。YOLOv5 是一个非常流行的图像识别框架&#xff0c;这里介绍一下使用 YOLOv5 给使用 Labelme 标注…

无心剑小诗《数学巨星,光芒万丈》

数学巨星&#xff0c;光芒万丈 在人类智慧的无尽星海 闪烁着数学先驱的万丈光芒 从阿基米德力拔山河的杠杆定律 到牛顿揭示宇宙秘密的微积分 欧拉横空出世&#xff0c;惊天动地 数论、几何与分析海洋里翻涌 高斯&#xff0c;加冕了“数学王子”的桂冠 他的世界&#xff0c;每…

C++八股学习心得.6

1.C 异常处理 异常是程序在执行期间产生的问题。C 异常是指在程序运行时发生的特殊情况 异常提供了一种转移程序控制权的方式。C 异常处理涉及到三个关键字&#xff1a;try、catch、throw。 throw: 当问题出现时&#xff0c;程序会抛出一个异常。这是通过使用 throw 关键字来…