JS:根据点击图片坐标,截取点击位置部分图片

2023-05-16

从一个完整的大图中截取一小部分出来:

    /**
     * 根据点击坐标获取一个20x20像素的图片
     */
    const getScreenShotFromScrcpyVideo = ( x ,y ) => {

        // //获取点击图片坐标位置
        // const {x,y} = getCurLocation();

        var imgObject = new Image();

        //载入原图像
        /*----------------------------------------加载图片----------------------------------------------------*/
        const canvas = document.createElement("canvas");
        const canvasCtx = canvas.getContext("2d");
        const video = document.getElementById('scrcpy-video');
        // 默认生成图片大小
        let w;
        let h;
        let widthAndHeigh = device._rawValue.size.split('x');
        //获取到的屏幕尺寸长小于宽,是竖屏
        if (directionStatus.value === 0 || directionStatus.value === 180) {
            // 竖屏 针对RAC的设备,不管屏幕切换问题,默认设置宽高比16:9
            if (screenMode.value == 'Scrcpy') {
                console.error("creenMode.value")
                w = imgWidth;
                h = imgHeight;
            } else {
                w = 369;
                h = 800;
            }
        } else if (screenMode.value == 'Scrcpy'){
            w = imgHeight;
            h = imgWidth;
        }else{
            w = 800;
            h = 369;
        }
        canvas.width = w;
        canvas.height = h;
        canvasCtx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, w, h);
        /*----------------------------------------加载图片结束----------------------------------------------------*/
        imgObject = canvas ;

        onPreloadComplete();

        //当图片完成载入以后,重新绘制你要截取的那一部分
        function onPreloadComplete(){
            //创建一个20x20大小的图片
            var newImg = getImagePortion(imgObject, 40, 40, x - 40, y - 40, 2);
            console.error(newImg)

            //创建新的请求,发送至server端
            let formData = new FormData();
            formData.append('file', base64toFile(newImg, "fileName"));
            formData.append('type', 'keepFiles');
            axios
                .post('/folder/upload', formData, {headers: {'Content-type': 'multipart/form-data'}})
                .then((resp) => {
                    console.error(JSON.stringify(resp))
                    if (resp['code'] === 2000) {
                        //构建一个新的element控件元素
                        let newElement = {};
                        newElement.eleValue = resp['data'];
                        newElement.projectId = project.value['id'];
                        newElement.eleType = "image";
                        newElement.eleName = "Element-Image-" + generateTimeReqestNumber();
                        newElement.eleDeviceModel = "MeitsMF4";
                        newElement.eleAppName = "";
                        newElement.eleGuiName = "";

                        //图片上传成功以后,再次调用自动添加控件元素的方法
                        axios
                            .post('/controller/elements/save?text="', newElement, {headers: {'Content-type': 'multipart/form-data'}})
                            .then((resp) => {
                                if (resp['code'] === 2000) {
                                    //图片上传成功以后,再次调用自动添加控件元素的方法
                                    ElMessage.success({
                                        message: '录制功能控件快照上传成功...',
                                    });
                                }
                            });
                    }
                });

        }
        /**
         * 根据当前时间生成一个对应的时间序列
         */
        function generateTimeReqestNumber() {
            var date = new Date();
            return date.getFullYear().toString() + pad2(date.getMonth() + 1) + pad2(date.getDate()) + pad2(date.getHours()) + pad2(date.getMinutes()) + pad2(date.getSeconds());
        }

        function pad2(n) { return n < 10 ? '0' + n : n }

        //图像截取
        function getImagePortion(imgObj, newWidth, newHeight, startX, startY, ratio){
            /* the parameters: - the image element - the new width - the new height - the x point we start taking pixels - the y point we start taking pixels - the ratio */
            //set up canvas for thumbnail
            var tnCanvas = document.createElement('canvas');
            tnCanvas.setAttribute("style","width: 100px;height: 100px;");
            var tnCanvasContext = tnCanvas.getContext('2d');
            tnCanvas.width = newWidth; tnCanvas.height = newHeight;

            /* use the sourceCanvas to duplicate the entire image. This step was crucial for iOS4 and under devices. Follow the link at the end of this post to see what happens when you don’t do this */
            var bufferCanvas = document.createElement('canvas');
            var bufferContext = bufferCanvas.getContext('2d');
            bufferCanvas.width = imgObj.width;
            bufferCanvas.height = imgObj.height;
            bufferContext.drawImage(imgObj, 0, 0);

            /* now we use the drawImage method to take the pixels from our bufferCanvas and draw them into our thumbnail canvas */
            tnCanvasContext.drawImage(bufferCanvas, startX,startY,newWidth * ratio, newHeight * ratio,0,0,newWidth,newHeight);
            console.error(tnCanvas)
            return tnCanvas.toDataURL();
        }

        /**
         * 将base64转换为图片
         */
        function base64toFile(data, fileName) {
            const dataArr = data.split(",");
            const byteString = atob(dataArr[1]);
            const options = {
                type: "image/jpeg",
                endings: "native"
            };
            const u8Arr = new Uint8Array(byteString.length);
            for (let i = 0; i < byteString.length; i++) {
                u8Arr[i] = byteString.charCodeAt(i);
            }
            return new File([u8Arr], fileName + ".jpg", options);//返回文件流
        }

    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS:根据点击图片坐标,截取点击位置部分图片 的相关文章

  • 设计/编码时,异常场景要处理到什么程度?容错到什么地步?

    设计时要清晰责任边界 xff0c 哪些异常需要吞掉自己处理 xff0c 哪些就暴露出去让其他服务 手段处理 这样目标清晰 xff0c 分工明确 xff0c 能够提高效率 xff0c 降低维护成本 xff0c 甩锅有理有据
  • 如何保质保量的完成需求

    如何保证数量 一个版本中 控制住每个需求的时间 即可保证数量 如何保证时间 避免返工 对齐 需求 设计方案 测试方案 代码质量 有问题一次解决 不修改引入新问题 设置路标 Roadmap 路标有时间节点 以及标明会完成哪些可度量的工作 每个
  • [Java] Request processing failed; nested exception is org.apache.ibatis.binding.Bin

    Request processing failed nested exception is org apache ibatis binding Bin springMVC xff0b mybatis 遇到的问题 xff0c 在XXXmapp
  • [Linux] CentOS7安装Chrome后yum不可以使用的解决方法

    症状 xff1a http dl google com linux chrome rpm stable x86 64 repodata repomd xml Errno 14 curl 52 Empty reply from server
  • [Java] 报错 java.lang.IllegalArgumentException: host parameter is null

    因为URL中存在中文字符 xff0c 需要编码 如 http baidu com 文件1 String encodeUrl 61 java span class hljs preprocessor net span span class h
  • Ubuntu 录屏

    GNOME录屏软件 Ubuntu 附带的屏幕录像机 xff0c 当您点击 Ctrl 43 Shift 43 Alt 43 R 时触发 它会自动开始录制整个屏幕 当您再次点击同一热键时 xff0c 截屏将结束并保存 点击录制热键时 xff0c
  • 【Odroid-XU4开发板】【安装Ubuntu18.04】【安装ROS】并读取串口数据的踩坑日记

    Odroid XU4开发板安装Ubuntu18 04安装ROS并读取串口数据的踩坑日记 文章目录 Odroid XU4开发板安装Ubuntu18 04安装ROS并读取串口数据的踩坑日记前言一 系统镜像准备二 烧录软件准备3 装机4 安装ro
  • 消除VS中C6054:可能没有为字符串"XXX"添加字符串零终止符的警告

    常见的是用 strlen 函数统计字符串的长度的时候 下面经常出现波浪线 xff08 即报警告C6054 xff09 xff0c 如下图所示 xff1a 怎么解决去掉这个警告呢 xff1f 64 wowpH 在这之前需要了解一下 strle
  • docker pull下载的image存在什么地方去了

    结论 xff1a 所有放入镜像文件都放在虚拟硬盘文件里面 windows上安装的docker其实本质上还是借助与windows平台的hyper v技术来创建一个linux虚拟机 xff0c 你执行的所有命令其实都是在这个虚拟机里执行的 xf
  • Eclipse CDT初步使用教程

    我用过Source insight和VS xff0c 感觉不顺手就没用了 xff0c 所以也没有深入研究过 xff0c 其他的如Code Blocks xff0c vim xff0c Clion Emacs我也没用过 xff0c 不好做评价
  • eclispe设置断点无效(No source file named)

    最近不知道做了什么操作导致eclipse的断点无效 xff0c 表现为gdb只认相对路径的断点 xff0c 不认绝对路径 xff0c 而eclipse打断点使用的是绝对路径 xff0c 导致无效 xff0c 输出信息是 xff1a No s
  • lemon源码基本概念整理

    1 数据结构 1 1 字符串存储 定义一个x1a的全局变量 xff0c 存放 y文件经过词法分析器分割出来的字符串 span class token keyword struct span s x1 span class token pun
  • lemon源码分析

    基本概念见上篇 lemon源码基本概念整理 1 follow集 对于如下4条产生式 program 61 expr TK SEM expr 61 expr TK IMPL expr expr 61 TK LPAREN expr TK RPA
  • Tcl脚本初步学习

    1 命令 Tcl 是一门基于命令的脚本语言 xff0c 每个命令通过换行符或分好隔开 每条命令都包含一个或多个单词 xff0c 第一个单词是命令名 xff0c 其他单词是命令的参数 xff0c 如 xff1a 命令 命令名 参数 set a
  • SQLite3源码学习(31) WAL日志的锁机制

    1 锁的原理 先来回顾一下回滚日志的文件锁 xff0c 之前的锁是针对数据库文件加锁的 xff0c 有4种类型 xff0c 分别是shared reserverd pending和exclusive 在WAL日志模式下不再使用原来的锁 xf
  • QGC调试px4固件飞控

    文章目录 前言一 开源软件地址二 硬件接线三 无人机调试1 刷固件2 选机架3 校准传感器4 校准遥控器5 飞行模式设置6 电源设置7 查看电机8 试飞 总结 前言 开源无人机调试 xff1a 硬件 xff1a pixhawk 2 4 8
  • CMake 基本使用方法

    1 学习背景 C语言工程使用make来构建工程 xff0c 但是对于大型工程来说文件的依赖关系很复杂 xff0c 手写makefile非常麻烦 xff0c 一般开源代码的构建方式都是使用autotool来配置编译环境和自动生成makefil
  • 嵌入式操作系统学习(3)FreeRTOS的任务调度机制

    1 任务状态 FreeRTOS可以创建多个任务 xff0c 但是对于单核cpu来说 xff0c 在任意给定时间 xff0c 实际上只有一个任务被执行 xff0c 这样就可以把任务分成2个状态 xff0c 即运行状态和非运行状态 当任务处于运
  • GTK+开发环境搭建

    一般讲到GUI程序开发 xff0c 大家都会想到C 43 43 等面向对象的高级语言 xff0c 而认为C语言不能做界面 C语言也可以用来写界面 xff0c GTK 43 就是一个用来写界面的库 xff0c 它本身就是用C语言写的 xff0

随机推荐