当前位置:首页 > JavaScript

js实现裁剪

2026-01-31 13:42:49JavaScript

使用Canvas实现图片裁剪

Canvas API提供了一种简单的方式来裁剪图片。创建一个canvas元素,获取其2D上下文,然后使用drawImage方法指定裁剪区域。

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const img = new Image();

img.onload = function() {
    const cropX = 50, cropY = 50, cropWidth = 200, cropHeight = 200;
    canvas.width = cropWidth;
    canvas.height = cropHeight;

    ctx.drawImage(img, cropX, cropY, cropWidth, cropHeight, 0, 0, cropWidth, cropHeight);
    document.body.appendChild(canvas);
};

img.src = 'image.jpg';

使用第三方库cropper.js

cropper.js是一个流行的图片裁剪库,提供丰富的交互功能。安装后通过简单配置即可实现专业级裁剪效果。

js实现裁剪

import Cropper from 'cropperjs';

const image = document.getElementById('image');
const cropper = new Cropper(image, {
    aspectRatio: 1,
    viewMode: 1,
    autoCropArea: 0.8,
    responsive: true
});

// 获取裁剪结果
const croppedCanvas = cropper.getCroppedCanvas();

响应式裁剪区域实现

结合鼠标事件实现动态裁剪区域选择。监听mousedown、mousemove和mouseup事件来绘制和调整裁剪框。

js实现裁剪

let isDragging = false;
let startX, startY, endX, endY;
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

canvas.addEventListener('mousedown', (e) => {
    isDragging = true;
    startX = e.offsetX;
    startY = e.offsetY;
});

canvas.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    endX = e.offsetX;
    endY = e.offsetY;
    drawSelectionBox();
});

function drawSelectionBox() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.strokeStyle = 'red';
    ctx.strokeRect(startX, startY, endX - startX, endY - startY);
}

保持宽高比的裁剪

通过计算宽高比约束,确保裁剪区域保持特定比例。在mousemove事件中根据比例调整坐标。

const aspectRatio = 16/9;
let width, height;

canvas.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    const deltaX = e.offsetX - startX;
    const deltaY = e.offsetY - startY;

    if (Math.abs(deltaX) > Math.abs(deltaY * aspectRatio)) {
        width = deltaX;
        height = width / aspectRatio;
    } else {
        height = deltaY;
        width = height * aspectRatio;
    }

    drawSelectionBox(startX, startY, width, height);
});

输出裁剪结果

将canvas裁剪结果转换为Blob或DataURL,便于上传或显示。使用toBlob或toDataURL方法。

canvas.toBlob((blob) => {
    const formData = new FormData();
    formData.append('croppedImage', blob);
    // 上传处理
}, 'image/jpeg', 0.9);

// 或获取DataURL
const imageDataURL = canvas.toDataURL('image/png');
document.getElementById('result').src = imageDataURL;

标签: js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…