<!DOCTYPE html>
<html>
<head>
<title>canvas主动裁剪图片空白区域</title>
</head>
<body>
<input type="file" id="imageInput" accept="image/*"><canvas id="canvas" style="display:none;"></canvas><div style="margin: 20px 0"> <img id="outputImage" src="" alt="剪切后的图片"></div><script> const imageInput = document.getElementById('imageInput'); const canvas = document.getElementById('canvas'); const outputImage = document.getElementById('outputImage'); const ctx = canvas.getContext('2d'); imageInput.addEventListener('change', function (e) { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = function (event) { const img = new Image(); img.src = event.target.result; img.onload = function () { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); // 获取图像的像素数据 const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); const data = imageData.data; // 找到非红色像素的边界 let minX = canvas.width; let minY = canvas.height; let maxX = -1; let maxY = -1; for (let y = 0; y < canvas.height; y++) { for (let x = 0; x < canvas.width; x++) { const index = (y * canvas.width + x) * 4; // 每个像素有4个通道(RGBA) const red = data[index]; const green = data[index + 1]; const blue = data[index + 2]; // 判断像素是否为红色 (255, 255, 255) if (red === 255 && green === 255 && blue === 255) { // 此像素是红色,跳过 } else { // 非红色像素 minX = Math.min(minX, x); minY = Math.min(minY, y); maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); } } } // 计算剪切后的图像宽度和高度 const croppedWidth = maxX - minX + 1; const croppedHeight = maxY - minY + 1; // 创立一个新的Canvas,将非红色区域绘制到新Canvas上 const newCanvas = document.createElement('canvas'); const newCtx = newCanvas.getContext('2d'); newCanvas.width = croppedWidth; newCanvas.height = croppedHeight; newCtx.drawImage(canvas, minX, minY, croppedWidth, croppedHeight, 0, 0, croppedWidth, croppedHeight); // 将解决后的图像显示在页面上的<img>元素中 outputImage.src = newCanvas.toDataURL(); }; }; reader.readAsDataURL(file); });</script>
</body>
</html>