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

【html】图片多矩形框裁剪

 说明

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

代码

<!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.kler.cn/a/105749.html

相关文章:

  • 【大语言模型】ACL2024论文-12 大型语言模型的能力如何受到监督式微调数据组成影响
  • 【Pythonr入门第二讲】你好,世界
  • Redis配置主从架构、集群架构模式 redis主从架构配置 redis主从配置 redis主从架构 redis集群配置
  • Matplotlib | 理解直方图中bins表示的数据含义
  • 麒麟时间同步搭建chrony服务器
  • 2. kafka 生产者
  • EasyPoi
  • Istio 自动注入 sidecar 失败导致无法访问webhook服务
  • DevOps持续集成-Jenkins(3)
  • 20231025 技能点
  • 【微信小程序】实现投票功能(附源码)
  • DevOps 笔记
  • react中使用jquery 语法
  • sql server 生成连续日期和数字
  • Java实现人脸识别和指纹认证
  • KVM虚拟化常见问题汇总
  • springcloud gateway转发后getServerName被更改的问题
  • 掌握CSS Flexbox,打造完美响应式布局,适配各种设备!
  • 【git命令】删除分支
  • docker服务CPU飙高排查
  • 基于STM32+OneNet设计的物联网智能鱼缸(2023升级版)
  • stable-diffusion-webui环境部署
  • uwb nlos(非视)研究-由一篇论文结合gpt深挖创新方法-拯救苦苦挣扎的研究生。
  • 浏览器是怎么执行JS的?——消息队列与事件循环
  • Visual Studio Professional 2019 软件安装教程(附安装包下载)
  • JVM——一些零散的概念(后续学习深入了再补充)