当前位置: 首页 > article >正文

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

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

<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内容转换为Blob
            canvas.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.kler.cn/a/452451.html

相关文章:

  • 3D滤波器处理遥感tif图像
  • 项目实战--网页五子棋(用户模块)(1)
  • 【NLP】ELMO、GPT、BERT、BART模型解读及对比分析
  • 下载并安装MySQL
  • windows及linux 安装 Yarn 4.x 版本
  • 计算机网络(六)应用层
  • Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架
  • 使用sql实现将一张表的某些字段数据存到另一种表里
  • 单片机:实现SYN6288语音播报(附带源码)
  • sql之全文索引
  • Android Jetpack LiveData源码解析
  • Leetcode3218. 切蛋糕的最小总开销 I
  • WordPress Tutor LMS插件 SQL注入漏洞复现(CVE-2024-10400)
  • workman服务端开发模式-应用开发-后端api登录之浏览器版本工具开发
  • 【计算机视觉CV-图像分类】06 - VGGNet的鲜花分类实现:从数据预处理到模型优化的完整实战!
  • 【监控】夜莺监控系统各环节资源压力分析
  • 基于python的电子报实现思路
  • HarmonyOS NEXT 实战之元服务:静态案例效果--- 歌手推荐
  • 【开源免费】基于SpringBoot+Vue.JS靓车汽车销售网站(JAVA毕业设计)
  • GitLab 停止中国区用户访问,为用户提供60天的迁移期
  • 音视频入门知识(四):封装篇
  • flutter教程01 flutter项目的目录结构
  • 单片机:实现设计简单计算器(4位加减乘除)(附带源码)
  • 【AIGC】2024-CVPR-分析和改进扩散模型的训练动态
  • C-5 B样条曲线
  • OSCP课后练习-tcpdump