浏览器点击视频裁剪当前帧,然后粘贴到页面

news/2024/12/28 1:20:06/

废话不多说,直接上代码
在这里插入图片描述在这里插入图片描述

<template><div class="index"><button @click="getImage">截取</button><video id="myVideo" width="320" height="240" src="../assets/a.mp4" controls></video><img id="capturedImage" alt="Captured Image" style="display: none;"></div>
</template><script>
export default {data() {return {};},methods: {getImage() {const video = document.getElementById("myVideo");const canvas = document.createElement("canvas");const ctx = canvas.getContext("2d");// 设置canvas的宽度和高度与视频相同canvas.width = video.videoWidth;canvas.height = video.videoHeight;// 将当前帧绘制到canvas上ctx.drawImage(video, 0, 0, canvas.width, canvas.height);// 将canvas内容转换为Blobcanvas.toBlob(async (blob) => {try {// 创建一个包含Blob的DataTransfer对象const data = new ClipboardItem({ "image/png": blob });await navigator.clipboard.write([data]);// alert("图像已复制到剪切板");// 自动粘贴到页面上this.pasteImage(blob);} catch (err) {console.error("无法复制图像到剪切板: ", err);}}, "image/png");},pasteImage(blob) {this.capturedBlob = blob;const imgElement = document.getElementById("capturedImage");const imageUrl = URL.createObjectURL(blob);imgElement.src = imageUrl;imgElement.style.display = "block";},},
};
</script><style lang="scss" scoped>
</style>

如果要进行上传的话,下面的操作

async Update() {// console.log(this.capturedBlob);let capturedFile = new File([this.capturedBlob],"captured_image.png",{ type: "image/png" });const formData = new FormData();formData.append("file", capturedFile, "captured_image.png");try {const response = await axios.post("updata///xxxxxx",//上传接口地址formData,{headers: {"Content-Type": "multipart/form-data",},});console.log(response);} catch (err) {console.error("上传文件时出错: ", err);this.uploadStatus = `文件上传失败: ${err.message}`;}},

浏览器直接获取系统剪切板数据

 async getImageFromClipboard() {try {// 不能直接进行粘贴,就算是已经在剪切板里面了,自动粘贴还是要获取权限信息// 请求权限const permissions = await navigator.permissions.query({name: "clipboard-read",});if (permissions.state === "granted" ||permissions.state === "prompt") {// 读取剪切板中的图像数据const items = await navigator.clipboard.read();for (const item of items) {if (item.types.includes("image/png")) {const blob = await item.getType("image/png");console.log(blob);this.pasteImage(blob);break;}}} else {alert("权限被拒绝,无法读取剪切板内容");}} catch (err) {console.error("无法读取剪切板内容: ", err);}},

详细代码(当前的需求是在一个页面获取到当前帧,然后在另一个页面获取剪切板并粘贴)

<template><div class="index"><img id="capturedImage" alt="Captured Image" style="display: none;width: 200px;height: 200px;"><button @click="Update">上传</button></div>
</template><script>
import axios from "axios";
export default {data() {return {capturedBlob: null,};},created() {this.getImageFromClipboard();},methods: {async getImageFromClipboard() {try {// 不能直接进行粘贴,就算是已经在剪切板里面了,自动粘贴还是要获取权限信息// 请求权限const permissions = await navigator.permissions.query({name: "clipboard-read",});if (permissions.state === "granted" ||permissions.state === "prompt") {// 读取剪切板中的图像数据const items = await navigator.clipboard.read();for (const item of items) {if (item.types.includes("image/png")) {const blob = await item.getType("image/png");console.log(blob);this.pasteImage(blob);break;}}} else {alert("权限被拒绝,无法读取剪切板内容");}} catch (err) {console.error("无法读取剪切板内容: ", err);}},pasteImage(blob) {this.capturedBlob = blob;const imgElement = document.getElementById("capturedImage");const imageUrl = URL.createObjectURL(blob);imgElement.src = imageUrl;imgElement.style.display = "block";},async Update() {// console.log(this.capturedBlob);let capturedFile = new File([this.capturedBlob],"captured_image.png",{ type: "image/png" });const formData = new FormData();formData.append("file", capturedFile, "captured_image.png");try {const response = await axios.post("xxxxxxxxxxxxxxxxxxxxxx",formData,{headers: {"Content-Type": "multipart/form-data",},});console.log(response);} catch (err) {console.error("上传文件时出错: ", err);this.uploadStatus = `文件上传失败: ${err.message}`;}},},
};
</script><style lang="scss" scoped>
</style>

http://www.ppmy.cn/news/1558658.html

相关文章

音视频入门知识(七):时间戳及其音视频播放原理

七、时间戳 解码时间戳DTS和显示时间戳PTS 解码时间戳&#xff08;DTS&#xff09; 定义&#xff1a;读入内存中的比特流在什么时候开始送入解码器中进行解码 作用&#xff1a;DTS 主要应用在编码视频流中&#xff0c;其中 B 帧&#xff08;双向预测帧&#xff09;和 P 帧&…

基于python的家教预约网站-家教信息平台系统

标题:基于 Python 的家教预约网站-家教信息平台系统 内容:1.摘要 本文介绍了一个基于 Python 的家教预约网站-家教信息平台系统。该系统旨在为学生和家长提供一个方便、高效的家教预约平台&#xff0c;同时也为家教老师提供一个展示自己教学能力和经验的机会。本文详细介绍了系…

【保姆式】python调用api通过机器人发送文件到飞书指定群聊

当前飞书webhook机器人还不支持发送文件类型的群消息&#xff0c;它目前仅支持文本&#xff0c;富文本&#xff0c;卡片等文字类型的数据。 我们可以申请创建一个机器人应用来实现群发送文件消息。 创建飞书应用 创建飞书应用、配置权限、添加机器人 来到飞书开发者后台 创建…

uni-app 统一请求处理 请求拦截器 响应拦截器 请求封装

封装API接口 import {http} from ../utils/request.js export function login(code){return http({url:/wx/getSession,method: GET,data:{code}}) }调用接口 import {login,test,phoneMessage,updateAvatar} from ../../api/user.js function userLogin(){ login(code.value…

深度学习在图像识别中的最新进展与实践案例

深度学习在图像识别中的最新进展与实践案例 在当今信息爆炸的时代&#xff0c;图像作为信息传递的重要载体&#xff0c;其处理与分析技术显得尤为重要。深度学习&#xff0c;作为人工智能领域的一个分支&#xff0c;凭借其强大的特征提取与模式识别能力&#xff0c;在图像识别…

详细对比JS中XMLHttpRequest和fetch的使用

在JavaScript中&#xff0c;XMLHttpRequest 和 fetch 是两种用于进行 HTTP 请求的 API。它们的主要区别在于设计理念、用法和功能支持。以下是两者的详细对比&#xff1a; 1. 语法与用法 XMLHttpRequest: 较老的 API&#xff0c;最早出现在 2000 年代。支持异步和同步请求&…

Java 【数据结构】 哈希(Hash超详解)HashSetHashMap【神装】

登神长阶 第十神装 HashSet 第十一神装 HashMap 目录 &#x1f454;一.哈希 &#x1f9e5;1.概念 &#x1fa73;2.Object类的hashCode()方法: &#x1f45a;3.String类的哈希码: &#x1f460;4.注意事项: &#x1f3b7;二.哈希桶 &#x1fa97;1.哈希桶原理 &#x…

#渗透测试#漏洞挖掘#红蓝攻防#漏洞挖掘#未授权漏洞-Es未授权漏洞

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…