js根据坐标进行图片截图,获取图片上指定位置的截图

2023-05-16

根据坐标截取图片上指定的区域,坐标可以是规则的图片截取,也可以是不规则的图片截取

实现思路:
规则裁剪自然不用多说,我们使用画布的getImageData(x,y,width,height)方法就可以得到指定规则区域的图片信息,其中参数在规则裁剪时也很好计算。
按照这个逻辑,在不规则裁剪时,我们也有个方法可以使用,即是画布的clip()截取。但是这个截取虽然遮蔽掉了我们不要的那部分,让在裁选区内的那部分得以显示,但画布实际上还是完整图片的大小。所以我们需要抠出需要的那部分,这时只需要计算出不规则图形的最小外接矩形,再使用getImageData(x,y,width,height)方法,就可以了

完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>获取图片上指定位置的截图</title>
    <style>
        .box{
            width: 50%;
            position: relative;
            float: left;
        }
        .divss{
            position: absolute;
            top: 0;
        }
        .cdd{
            position: absolute;
            border: 5px solid rgb(179, 2, 2);
            border-radius: 50%;
        }
        canvas{
            border: 1px solid #666;
        }
    </style>
</head>
<body>
    <div class="box">
        <img src="./4.png" alt="">
        <!-- 截取坐标在图上的位置 -->
        <div class="divss">
            <div class="cdd" style="left: 50px;top:150px;"></div>
            <div class="cdd" style="left: 150px;top:200px;"></div>
            <div class="cdd" style="left: 100px;top:250px;"></div>
            <div class="cdd" style="left: 20px;top:210px;"></div>
        </div>
    </div>
    <div style="float: right;">
	    <p>画布首次裁剪</p>
	    <canvas id="imgDom">画布首次裁剪</canvas>
	    <p>画布最终规则裁剪</p>
	    <canvas id="imgClipDom">画布最终规则裁剪</canvas>
	</div>
    <script src="./lib/jquery-3.6.0/jquery-3.6.0.min.js"></script>
    <script>
    // 截取指定坐标的图片信息
    var canvas=document.getElementById('imgDom');
    var ctx=canvas.getContext('2d');
    var img=new Image();
    img.src='./4.png';
    // img.crossOrigin = ''
    var clipPos=[[50,150],[150,200],[100,250],[20,210]]
    img.onload=function(){
        console.log(this)
        canvas.width=img.width;
        canvas.height=img.height;
        ctx.beginPath();
        ctx.moveTo(clipPos[0][0],clipPos[0][1]);
        ctx.lineTo(clipPos[1][0],clipPos[1][1]);
        ctx.lineTo(clipPos[2][0],clipPos[2][1]);
        ctx.lineTo(clipPos[3][0],clipPos[3][1]);
        // 裁剪后其他区域不可见,然后再绘制图片,就会只剩下指定的区域;
        // 实际上画布还是原本图片的宽高大小,只是指定的区域里面才有图片内容,其他区域是空白的;
        // 画布裁剪只能裁剪出规则的矩形,这时候需要算出指定有效坐标区域的最小外接矩形,使不规则转变为规则
        ctx.clip();
        ctx.drawImage(img,0,0,img.width,img.height);
        // 当绘制图形不规则时,根据左右上下的坐标得到不规则图形外的最小外接矩形,进行规则裁剪
        // 首先循环获取最小的x,y 和 最大的x,y
        var minLeft=clipPos[0][0],maxLeft=clipPos[0][0],minTop=clipPos[0][1],maxTop=clipPos[0][1]
        for (let index = 1; index < clipPos.length; index++) {
            const item = clipPos[index];
            if(item[0]<minLeft){
                minLeft=item[0]
            }
            if(item[0]>maxLeft){
                maxLeft=item[0]
            }
            if(item[1]<minTop){
                minTop=item[1]
            }
            if(item[1]>maxTop){
                maxTop=item[1]
            }
        }
        // 得到规则矩形对应区域的图片数据
        console.log(minLeft,minTop,maxLeft-minLeft,maxTop-minTop)
        var imgClipData=ctx.getImageData(minLeft,minTop,maxLeft-minLeft,maxTop-minTop);
        var canvas2 = document.getElementById("imgClipDom")
        var cxt2=canvas2.getContext("2d")
        canvas2.width=imgClipData.width
        canvas2.height=imgClipData.height
        cxt2.putImageData(imgClipData,0,0,0,0,imgClipData.width,imgClipData.height)
        // 可以转换为base64进行查看
        // var img2 = canvas2.toDataURL("image/png");
    }

    </script>
</body>
</html>

效果如下:
在这里插入图片描述

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

js根据坐标进行图片截图,获取图片上指定位置的截图 的相关文章

  • 为猿七年有余,痒否?痛否?

    还未有感 xff0c 已然岁末 xff0c 犹叹时之箭逝去如斯也 xff0c 稍纵命再减一 回首望 xff0c 为猿七年有余已 xff0c 虽不成气候 xff0c 亦未全蹉跎 略做小结 xff0c 以不惘逝去之时日 xff0c 亦会大益于尔
  • Android实战技巧:如何在ScrollView中嵌套ListView

    前几天因为项目的需要 xff0c 要在一个ListView中放入另一个ListView xff0c 也即在一个ListView的每个ListItem中放入另外一个ListView 但刚开始的时候 xff0c 会发现放入的小ListView会
  • Android实战技巧:ViewStub的应用

    在开发应用程序的时候 xff0c 经常会遇到这样的情况 xff0c 会在运行时动态根据条件来决定显示哪个View或某个布局 那么最通常的想法就是把可能用到的View都写在上面 xff0c 先把它们的可见性都设为View GONE xff0c
  • 深入浅出Windows BATCH

    1 什么是Windows BATCH BATCH也就是批处理文件 xff0c 有时简称为BAT xff0c 是Windows平台上的一种可执行脚本 xff0c 与 nix Linux和Unix 上的Shell脚本和其他的脚本 xff08 P
  • Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧 xff1a 多线程AsyncTask 这里就不重复 AsyncTask引发的一个问题 上周遇到了一个极其诡异的问题
  • 学习Kotlin,看这一篇就够了

    人生苦短 xff0c 要用Kotlin 这是一种对程序猿更为友好的语言 xff0c 可以减少开发者的工作量 xff0c 原本由开发者干的事情 xff0c 其实很多都可以由编译器实现了 xff0c 这是一种更为高级的语言 Java虽然严谨 x
  • Sed与AWK入门教程之Sed篇

    Sed和AWK是 nix命令行里面文本处理的神器 相当的强大 它们都是面向行的 或者说它们处理文本的方式都是一行接着一行的处理 从标准输入或者文件中读取内容 一行一行的执行脚本命令 然后打印输出到标准输出 直到文件结尾 EOF Sed Se
  • 老鸟的Python入门教程

    重要说明 这不是给编程新手准备的教程 如果您入行编程不久 或者还没有使用过1到2门编程语言 请移步 这是有一定编程经验的人准备的 最好是熟知Java或C 懂得命令行 Shell等 总之 这是面向老鸟的 让老鸟快速上手Python教程 为什么
  • 2022-2-28 T265 追踪相机 vrep逆运动学

    安装realsense SDK Ubuntu 16 安装realsense SDK 需要注意相机坐标系到机械臂坐标系的转变 下一步还需要完成末端的深度相机标定 realsense自带的API功能很全了 得到的追踪相机位姿直接融入之前的qt工
  • 运动规划-深蓝学院-高飞

    运动规划 正文一课程介绍outline xff1a map参考资源 二基于搜索DijkstraA grid based path search跳点jump point search 采样算法概率路线图prm快速搜索随机数 rrt 三带动力学
  • 在Intel nuc上使用自己的相机(Intel RealSense D435i)运行VINS-Mono及问题记录

    文章目录 一 遇到的问题 二 基础环境搭建 Step 1 安装 ROS Kinetic Step 2 安装Intel RealSense SDK Step 3 安装 Intel RealSense ROS Step 4 检验是否能在ros使
  • install opencv-contrib-dev to use aruco code

    using tsinghua sources list sudo apt get install libopencv contrib dev include so directory add so directory
  • Linux编译C文件

    熟悉了Windows平台下编译一个C 43 43 工程后 xff0c 你是否会提出这样一个问题 xff1a 在Linux平台下又如何编译一个C 43 43 工程呢 xff1f 希望本文能给正在学习或想学习Linux C 43 43 开发的你
  • 学习笔记——atoi函数的用法及用C语言实现atoi

    学习笔记 atoi函数的用法及用C语言实现atoi from csdn 库函数原型 xff1a inclue lt stdlib h gt int atoi const char nptr 用法 xff1a 将字符串里的数字字符转化为整形数
  • 互斥信号量和二进制信号量的区别

    互斥信号量和二进制信号量的区别 互斥型信号量必须是同一个任务申请 xff0c 同一个任务释放 xff0c 其他任务释放无效 同一个任务可以递归申请 二进制信号量 xff0c 一个任务申请成功后 xff0c 可以由另一个任务释放 二进制信号量
  • 堆栈区别

    堆和栈的区别 一 预备知识 程序的内存分配 一个由c C 43 43 编译的程序占用的内存分为以下几个部分 1 栈区 xff08 stack xff09 由编译器自动分配释放 xff0c 存放函数的参数值 xff0c 局部变量的值等 其操作
  • 用四个砝码称出1—40克所有重量,四个砝码分别为多少? 梅氏砝码问题

    这个在数学上叫做梅氏砝码问题 xff0c 其叙述如下 xff1a 若有n个砝码 xff0c 重量分别为M1 M2 xff0c Mn 且能称出从1到 xff08 M1 43 M2 43 43 Mn 的所有重量 xff0c 则再加一个砝码 xf
  • Linux 文件夹 压缩 命令

    from http hi baidu com no fear no hope blog item 8182155aec16a7c59d82046d html Linux 文件夹 压缩 命令 2011年08月28日 星期日 22 02 Lin
  • mysql 分库分表

    分表是分散数据库压力的好方法 分表 xff0c 最直白的意思 xff0c 就是将一个表结构分为多个表 xff0c 然后 xff0c 可以再同一个库里 xff0c 也可以放到不同的库 当然 xff0c 首先要知道什么情况下 xff0c 才需要

随机推荐

  • MySQL的数据库引擎的类型

    你能用的数据库引擎取决于mysql在安装的时候是如何被编译的 要添加一个新的引擎 xff0c 就必须重新编译MYSQL 在缺省情况下 xff0c MYSQL支持三个引擎 xff1a ISAM MYISAM和HEAP 另外两种类型INNODB
  • Fast-Planner安装、环境配置以及问题解决

    Fast Planner是香港科技大学沈劭劼老师团队开源的项目 旨在复杂的未知环境中实现四旋翼快速飞行 Fast Planner的github网址为 https github com HKUST Aerial Robotics Fast P
  • 安装双系统出现的一些问题(显卡和无法连接WIFI)

    显卡 问题1 xff1a 安装双系统之后开机黑屏 xff0c 由于显卡引起 xff0c 显卡不支持 解决办法 xff1a 禁用独立显卡或者更改显卡设置 xff0c 进入文件 boot grub grub cfg xff0c 按下图加入标亮字
  • ros没装全,gazebo模型加载不出来

    ros没装全 xff0c gazebo模型加载不出来 安装ros 关于rosdep update 首先换热点试一下 xff0c 在来回切换wifi 按照https blog csdn net yufeng1108 article detai
  • catkin_make遇到 gazebo_ros_controlConfig.cmake相关的问题

    现象 xff1a Could not find a package configuration file provided by gazebo ros control with any of the following names 解决方法
  • 一些vscode自动提示报错

    Pointer to incomplete class type is not allowed 通常是由于类声明了但是没有定义造成的 xff0c 需要做的是在错误文件里面引用下这个类 xff1a class Test xff1b a poi
  • bazel一些用法

    1 编译东西 要在根目录下 xff0c 和WORKSPACE在同一级 例如 xff0c 对于bazelbuild examples 而BUILD文件一般与源文件并列 examples cpp tutorial stage1 main BUI
  • 第十一节std::atomic原子操作

    一 原子操作 1 1原子操作概念例子 互斥量 xff1a 多线程编程中保护共享数据 xff1a 锁 xff0c 操作共享数据 xff0c 开锁 有两个线程 xff0c 对一个变量进行操作 xff0c 这个线程读 xff0c 另一个线程往变量
  • 用Ceres实现PnP

    在ceres中实现PnP优化 xff08 仅优化位姿 xff09 视觉SLAM十四讲 课后习题 ch7 xff08 更新中 xff09
  • deque insert()函数几种用法

    C 43 43 deque insert 用法及代码示例
  • Matplotlib error: No such file or directory: ‘latex‘: ‘latex‘

    Matplotlib error No such file or directory latex latex span class token function sudo span apt span class token function
  • 在ROS下Intel RealSense D435i 驱动的安装,避免踩坑,避免缺少imu话题等各种问题(适用于D400系列、SR300和T265跟踪模块等)

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net AnChenliang 1002 article details 109454465 目录 背景 方法1 使用apt安装 不建议使用此方法 了解一下
  • wsl作为开发主机与开发板联调

    linux开发经历记录 wsl作为开发主机与开发板联调 uboot使用nfs网络挂载时使用hanewin搭建win10的nfs servers 背景介绍 小白学习linux开学 xff0c 不想用VM虚拟机作为开发平台 xff0c 恰好了解
  • weka中文乱码解决办法

    由于weka的默认字符集编码是Cp1252 xff0c 所以如果你导入的数据中有中文字符 xff0c 就会出现乱码的情况 xff0c 所以需要weka的RunWeka ini文件 将cp1252替换成你的数据对应的字符集编码 xff0c 比
  • 动态库和静态库的区别

    静态库 xff1a 这类库的名字一般是libxxx a xff1b 1 利用静态函数库编译成的文件比较大 xff0c 因为整个函数库的所有数据都会被整合进目标代码中 xff0c 他的优点就显而易见了 xff0c 2 即编译后的执行程序不需要
  • 重复数据删除技术(Data Deduplication)

    我相信所有人都会同意 xff0c 数据存储正在以飞快地 xff0c 甚至是令人震惊的速度在增长 这意味着为了不影响普通用户的正常使用 xff0c 存储管理员们不得不加班加点地在幕后 工作着 他们的鲜为人知的工作包括 xff1a 配额管理 x
  • TCP/IP协议

    TCP IP 协议栈是一系列网络协议的总和 xff0c 是构成网络通信的核心骨架 xff0c 它定义了电子设备如何连入因特网 xff0c 以及数据如何在它们之间进行传输 TCP IP 协议采用4层结构 xff0c 即应用层 传输层 网络层和
  • 趣谈网络协议-云计算中的协议

  • ros里Catkin的CMakelists/package.xml

    Catkin是基于CMake的编译构建系统 xff0c 具有以下特点 xff1a Catkin沿用了包管理的传统像 find package 基础结构 pkg config扩展了CMake xff0c 例如 软件包编译后无需安装就可使用 自
  • js根据坐标进行图片截图,获取图片上指定位置的截图

    根据坐标截取图片上指定的区域 xff0c 坐标可以是规则的图片截取 xff0c 也可以是不规则的图片截取 实现思路 xff1a 规则裁剪自然不用多说 xff0c 我们使用画布的getImageData x y width height 方法