【html】图片多矩形框裁剪

news2024/7/6 17:42:56

 说明

由于项目中需要对一个图片进行多选择框进行裁剪,所以特写当前的示例代码。

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <base href="/">
    <title>图片裁剪</title>
</head>
<body>
<canvas id="myCanvas" style="border:1px solid #d3d3d3;">
    Your browser does not support the HTML5 canvas tag.
</canvas>
<script>
    let canvas = document.getElementById("myCanvas");
    let ctx = canvas.getContext("2d");
    let img = new Image();
    let rate = 1
    img.onload = function () {
        let width = img.width
        let height = img.height
        if (img.width > window.innerWidth || img.height > window.innerHeight) {
            if (window.innerWidth / img.width > window.innerHeight / img.height) {
                rate = window.innerHeight / img.height
                width = img.width * rate
                height = window.innerHeight
            } else {
                width = window.innerWidth
                rate = window.innerWidth / img.width
                height = img.height * rate
            }
        }
        // 等比缩小
        canvas.width = width;
        canvas.height = height;
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
    }
    let url = new URL(window.location.href);
    let params = new URLSearchParams(url.search);

    img.src = "https://img1.baidu.com/it/u=1486134966,661096340&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500";

    // 坐标数组
    let coorArr = []
    // 当前坐标
    let coor = {}

    // 鼠标按下
    canvas.onmousedown = function (e) {
        coor.begin = {
            x: e.clientX - canvas.offsetLeft,
            y: e.clientY - canvas.offsetTop
        }
        coor.end = {
            x: 0,
            y: 0
        }
    }

    // 移动鼠标
    canvas.onmousemove = function (e) {
        let begin = coor.begin;
        if (begin === undefined || begin.x === undefined) {
            return
        }
        coor.begin = coor.begin
        coor.end = {
            x: e.clientX - canvas.offsetLeft,
            y: e.clientY - canvas.offsetTop
        }

        draw();
        drawLine(coor);
    }

    // 鼠标放开
    canvas.onmouseup = function (e) {
        let begin = coor.begin;
        if (begin === undefined || begin.x === undefined) {
            return
        }
        coorArr.push({
            begin: coor.begin,
            end: {
                x: e.clientX - canvas.offsetLeft,
                y: e.clientY - canvas.offsetTop
            }
        })

        draw();

        coor.begin = {}
    }

    // 双击裁剪
    canvas.ondblclick = function () {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
        coorArr = []
        coor = {}
    }

    // 鼠标离开则清理
    canvas.onmouseout = function () {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
        coorArr = []
        coor = {}
    }

    // 画框
    function draw() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

        ctx.beginPath();
        ctx.strokeStyle = 'green';
        ctx.lineWidth = 5;
        ctx.lineCap = 'round';
        ctx.lineJoin = 'round';

        // 先画之前的框
        coorArr.forEach(coor => {
            drawLine(coor);
        });

        // 显示光标位置信息
        ctx.font = "18px Arial";
        ctx.fillStyle = "red";
        // 在canvas外显示光标位置
        ctx.fillText("缩放:" + rate.toFixed(2) + ";说明:鼠标离开画布清理,鼠标双击进行裁剪。", 5, 30);
    }

    // 画矩形
    function drawLine(coor) {
        let begin = coor.begin;
        let end = coor.end;
        // 画矩形
        ctx.moveTo(begin.x, begin.y);
        ctx.lineTo(end.x, begin.y);

        ctx.moveTo(end.x, begin.y);
        ctx.lineTo(end.x, end.y);

        ctx.moveTo(end.x, end.y);
        ctx.lineTo(begin.x, end.y);

        ctx.moveTo(begin.x, end.y);
        ctx.lineTo(begin.x, begin.y);
        ctx.stroke();
    }
</script>
</body>
</html>

示例

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1136976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【广州华锐互动】智能家居设计3D虚拟还原系统

随着科技的飞速发展&#xff0c;人们对家居生活的需求也在不断提高。智能家居作为一种新兴的生活方式&#xff0c;正逐渐成为现代人追求的理想居住环境。而智能家居设计3D虚拟还原系统&#xff0c;正是为了让人们更好地了解和体验智能家居带来的便捷与舒适&#xff0c;让未来生…

Latex笔记

1. Section 编号方式(数字、字母、罗马)&计数器计数形式修改 IEEE模板中Section的编号是罗马数字&#xff0c;要是改投其他刊物的话可能得用阿拉伯数字&#xff0c;所以可以在导言部分做如下修改&#xff08;放在导言区宏包调用之后&#xff09;&#xff1a; \renewcomma…

AMD大规模裁员15%? 赔偿N+7?官方回应来了 | 百能云芯

近日&#xff0c;美国芯片大厂AMD遭传出在中国进行大规模裁员15%的消息&#xff0c;引发网友关注。 对此&#xff0c;AMD官方26日回应称&#xff0c;「网络传闻失实」&#xff0c;该公司并没有进行大规模裁员。 相反地&#xff0c;AMD是进行的「小幅度」的组织架构优化和重组&a…

使用node创建Web服务

创建Web服务 基于 Node.js 环境&#xff0c;使用内置 http 模块&#xff0c;创建 Web 服务程序 需求&#xff1a;引入 http 模块&#xff0c;使用相关语法&#xff0c;创建 Web 服务程序&#xff0c;响应返回给请求方一句提示 ‘hello&#xff0c;world’ 步骤&#xff1a; 引…

高速电路设计----第三章(3)LVPECL、CML逻辑电平详解

一、LVPECL介绍 LVPECL是ECL电平的正电源、低电压版本。 ECL电平是指发射极耦合逻辑&#xff08;Emitter Coupled Logic&#xff09;,与TTL相同&#xff0c;ECL的主体结构由三极管组成&#xff0c;不同的是 ECL内部的三极管工作在非饱和状态&#xff08;即截止或者放大状态&…

你能用原来的塞子保存你未喝完的葡萄酒吗?

这是一个工作日的晚上&#xff0c;你发现自己在商店的过道里寻找一瓶葡萄酒。在您的高贵探索中&#xff0c;您可能已经注意到了装饰在每个独特瓶子顶部的各种瓶盖&#xff0c;有些是软木塞&#xff0c;有些是一个简单的螺旋盖。在最终决定了一个有趣的外观黑皮诺葡萄酒带回家品…

python安装包失败 安装scipy包

最近在配深度学习环境&#xff0c;安装好了conda、CUDA、cuDNN&#xff0c;运行之后报错&#xff0c;没有scipy包。 试了很多方法&#xff1a; 用命令行pip、conda install 在pycharm下载包 在环境中添加包 都失败了 要么直接ERROR&#xff0c;要么超时 问了师兄 需要在conda环…

sys.dm_exec_requests中statement_start_offset与statement_end_offset

文章目录 1.缘起2.根因3.示例4.附录 1.缘起 mssql中查早阻塞与及其相关联的sql时&#xff0c;遇到如下内容&#xff0c;故记录一下&#xff0c; substring(dest_blocked.text,der.statement_start_offset/21,(case when der.statement_end_offset-1 then DATALENGTH(der.sta…

GZ035 5G组网与运维赛题第1套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第1套 赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子任务2:5G室内与室外站点建设(20分) 竞赛模块2--5G公共网络运维与优化(3…

【ETL工具】本地环境IDEA远程DEBUG调试Flume代码

&#x1f984; 个人主页——&#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01;&…

推开科研成果落地“最后一扇门”

科研成果只有落地了&#xff0c;才能发挥出它真正的价值。虽然中国近几年已经飞速发展&#xff0c;但是我们的自主创新能力依然比不了发达国家。而且&#xff0c;尽管科研成果在理论和实践上已经取得了很大的进展&#xff0c;但如何将其落地到实际生产中仍然存在很多问题。其中…

如何训练Embedding Model

BGE的技术亮点&#xff1a; 高效预训练和大规模文本微调&#xff1b;在两个大规模语料集上采用了RetroMAE预训练算法&#xff0c;进一步增强了模型的语义表征能力&#xff1b;通过负采样和难负样例挖掘&#xff0c;增强了语义向量的判别力&#xff1b;借鉴Instruction Tuning的…

如何在k8s的Java服务镜像(Linux)中设置中文字体

问题描述&#xff1a;服务是基于springboot的Java服务&#xff0c;在项目上是通过Maven的谷歌插件打包&#xff0c;再由k8s部署的。k8s的镜像就是一个Java服务&#xff0c;Java服务用到了中文字体。 解决这个问题首先需要搞定镜像字体的问题。有很多类似的解决方案&#xff0c;…

window环境下安装node.js8+angular6

安装node.js8 1.登录node官网 node官网Node.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en2.找到适合自己的版本 选择下载 安装的时候一键next傻瓜式安装即可 设置淘宝镜像&#xff1a; npm config set registry https://regist…

动态增删kdtree(ikdtree)主要思路

ikdtree本质上也是一种kdtree,基本的构造方法和kdtree是一样的&#xff0c;本文主要记录两者不一样的地方&#xff0c;以港大MaRS实验室最新开源的增量式 kd-tree&#xff08;https://github.com/hku-mars/ikd-Tree&#xff09;里面的一些代码作为示范。 以下是ikdtree结构体包…

【Linux精讲系列】——yum软件包管理

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;Linux系统软件包管理工具yum讲解 &#x1f604;每日一言&#xff1a;踏向彼岸的每一步&#xff0c;都是到达彼岸本身。 目录 前言 Linux系统下的软件下载方式 yum 查看软件包 如何安装软件 如何卸…

业务连续性和恢复性计划:保障企业IT业务的可靠性

第一章&#xff1a;引言 在当今数字化时代&#xff0c;企业对信息技术的依赖愈发显著&#xff0c;IT系统的稳定性和可用性变得至关重要。无论是自然灾害、硬件故障还是网络攻击&#xff0c;都可能导致业务中断&#xff0c;从而带来严重的经济损失和声誉损害。为了保障企业IT业…

UI自动化测试工具推荐

UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势&#xff0c;包括提高测试效率、减少人力成本、提升软件质量等。同时&#xff0c;可视化工具为UI自动化测试带来了更多便利和灵活性。然而&#xff0c;可视化工具也存在一些潜在的劣势。本文将探讨…

【电路笔记】-波特图(Bode Diagrams)

波特图(Bode Diagrams) 文章目录 波特图(Bode Diagrams)1、概述2、定义3、波特图的呈现4、常见的波特图4.1 一阶滤波器4.2 二阶滤波器 5、总结 1、概述 上世纪30年代末&#xff0c;一位名叫 Hendrick Wade Bode 的美国工程师设计了一个著名的表示法来研究频域中的交流电路。 这…

stable diffusion简介和原理

Stable Diffusion中文的意思是稳定扩散&#xff0c;本质上是基于AI的图像扩散生成模型。 Stable Diffusion是一个引人注目的深度学习模型&#xff0c;它使用潜在扩散过程来生成图像&#xff0c;允许模型在生成图像时考虑到文本的描述。这个模型的出现引起了广泛的关注和讨论&am…