JavaScript图片裁剪上传核心是前端Canvas裁剪生成Blob再上传:先用input选图并预览,Canvas按坐标截取区域,toBlob输出JPEG Blob;推荐Cropper.js等库简化实现;最后用FormData上传Blob,注意EXIF方向、大图缩放和移动端适配。
JavaScript 实现图片裁剪并上传,核心是“前端裁剪 + 后端接收”,关键在于:裁剪不依赖后端计算,而是用 Canvas 提取用户选中的区域生成新图片,再以 Blob 或 Base64 形式提交给服务器。
借助 读取本地图片,用 Canvas 绘制原始图和裁剪框,再用 ctx.drawImage() 按坐标+宽高截取目标区域:
URL.createObjectURL(file) 快速预览图片 元素,获取真实尺寸(避免缩放干扰)x, y, width, height(相对于原图的像素值)width/height = 裁剪宽高,调用 drawImage(img, sx, sy, sWidth, sHeight, 0, 0, dWidth, dHeight) 截图canvas.toBlob(callback, 'image/jpeg', 0.9) 生成高质量 JPEG Blob(推荐,比 Base64 更省内存)手动实现拖拽缩放较复杂,建议用成熟库降低出错率:
cropper.getCroppedCanvas().toBlob() 即得裁剪后 Blob将 Blob 封装进 FormData,用 fetch 或 XMLHttpRequest 发送到后端接口:
new File([blob], 'avatar.jpg', {type: 'image/jpeg'})),便于后端识别const formData = new FormData(); formData.append('image', file);
fetch('/api/upload', { method: 'POST', body: formData })
实际开发中容易忽略但影响体验的关键细节:
ientation,直接显示会旋转。需用 exif-js 或 piexifjs 读取并修正 Canvas 绘制逻辑createObjectURL 生成的 URL 只在当前页面有效,关闭标签页即失效;不要存到 localStorage 或传给后端),并确保裁剪框触摸区域足够大不复杂但容易忽略。核心就三步:选图 → 可视化裁剪 → 提取 Blob 并上传。选对工具(如 Cropper.js)能省下 80% 的兼容性调试时间。