JS实现选择图片剪裁及保存

JS实现选择图片剪裁及保存

以下是一个简单的示例代码,实现了显示一个文件上传框和一个canvas元素。用户可以选择一张图片文件后,该图像将显示在canvas中,并且用户可以通过鼠标拖拽来选取需要剪裁的区域。单击“剪裁”按钮,程序会将结果保存为新的图片文件并在浏览器中下载。

先看效果图:

源码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JS图片剪裁并保存</title>
</head>
<body>    

    <canvas id="canvas" width="800" height="600" style="border:1px solid #000;"></canvas>

    <div>       
       <input type="file" id="fileInput">
       <button id="cropButton" disabled>剪裁</button> 
       用户可以拖动鼠标来选择需要剪裁的区域       
    </div>

    <script>
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        let image = null;
        let isDragging = false;
        let startX = 0;
        let startY = 0;
        let endX = 0;
        let endY = 0;

        // 加载图片
        const loadImage = (file) => {
            const reader = new FileReader();
            reader.onload = (e) => {
                image = new Image();
                image.onload = () => {
                    ctx.drawImage(image, 0, 0);
                };
                image.src = e.target.result;
            };
            reader.readAsDataURL(file);
	    disableButtons(); //
        };

        // 监听文件上传事件
        const fileInput = document.getElementById('fileInput');
        fileInput.addEventListener('change', (e) => {
            const file = e.target.files[0];
            loadImage(file);
        });

        // 监听鼠标事件,绘制选择区域
        canvas.addEventListener('mousedown', (e) => {
            if (isDragging) return;
            isDragging = true;
            startX = e.offsetX;
            startY = e.offsetY;
            endX = startX;
            endY = startY;
        });
        canvas.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            endX = e.offsetX;
            endY = e.offsetY;
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.drawImage(image, 0, 0);
            ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';
            ctx.fillRect(startX, startY, endX - startX, endY - startY);
        });
        canvas.addEventListener('mouseup', () => {
            isDragging = false;
            if (endX > startX && endY > startY) {
                enableButtons();
            }
        });

        // 监听确定按钮点击事件,剪裁并保存图片
        const cropButton = document.getElementById('cropButton');
        cropButton.addEventListener('click', () => {
            disableButtons();
            const croppedCanvas = document.createElement('canvas');
            const croppedCtx = croppedCanvas.getContext('2d');
            const width = endX - startX;
            const height = endY - startY;
            croppedCanvas.width = width;
            croppedCanvas.height = height;
            croppedCtx.drawImage(canvas, startX, startY, width, height, 0, 0, width, height);
            const url = croppedCanvas.toDataURL();
            const link = document.createElement('a');
            link.download = 'cropped-image.png';
            link.href = url;
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        });

	// 激活按钮
        const enableButtons = () => {
            cropButton.disabled = false;           
        };

        // 禁用按钮
        const disableButtons = () => {
            cropButton.disabled = true;   
        };
       
    </script>
</body>
</html>

OK!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值