58行html/js代码实现图片裁剪并保存功能

58行html/js代码实现图片裁剪保存功能

<input type="file" id="file-input" accept="image/*">
<button id="crop-button">裁剪</button>
<p>上传图片后,鼠标裁剪部分的左上角点下后拖移到右下角后放开,点裁剪按钮</p>
<table border="1">
<tr><td>长</td><td>宽</td><td>X</td><td>Y</td><td>W</td><td>H</td><td>W:H</td></tr>
<tr><td colspan='2' id='x'>NaN,NaN</td><td colspan='4' id='y'>NaN,NaN,NaN,NaN</td><td id='z'>W:H</td></tr>
</table>
<canvas id="canvas" style="border:1px solid red;"></canvas>
<script type="text/javascript">
var fileInput = document.getElementById("file-input");
var canvas = document.getElementById("canvas");
var cropButton = document.getElementById("crop-button");
var ctx = canvas.getContext("2d");
let startX, startY; const rect = canvas.getBoundingClientRect();
canvas.addEventListener('mousedown', (event) => {
startX = event.clientX - rect.left; startY = event.clientY-rect.top;
});
canvas.addEventListener('mouseup', (event) => {
const endX = event.clientX - rect.left; const endY = event.clientY-rect.top;
const rectX = Math.min(startX, endX);  const rectY = Math.min(startY, endY);
const width = Math.abs(endX - startX); const height = Math.abs(endY - startY);
document.getElementById("y").innerHTML=rectX+","+rectY+","+width+","+height;
const bilie = height/width; //num.toFixed(2)
document.getElementById("z").innerHTML="1:"+ bilie.toFixed(2);
});
fileInput.addEventListener("change", handleFileSelect);
cropButton.addEventListener("click", cropImage);
function handleFileSelect(event) {
var file = event.target.files[0];
if (!file.type.match("image.*")) { alert("请选择一张图片文件"); return; }
var reader = new FileReader();
reader.onload = function(event) {
var img = new Image();
img.onload = function() {
canvas.width = img.width; canvas.height = img.height;
document.getElementById("x").innerHTML = img.width+','+img.height;
ctx.drawImage(img, 0, 0);
}
img.src = event.target.result;
}
reader.readAsDataURL(file);
}
function cropImage() {
var cropArea = document.getElementById("y").innerHTML;
if (!cropArea) { return; }
var [x, y, w, h] = cropArea.split(",");
if(w<20 || h<20) { alert("长宽太小:"+cropArea); return; }
var croppedImage = ctx.getImageData(x, y, w, h);
var resultCanvas = document.createElement("canvas");
resultCanvas.width = w; resultCanvas.height = h;
var resultCtx = resultCanvas.getContext("2d");
resultCtx.putImageData(croppedImage, 0, 0);
var downloadLink = document.createElement("a");
downloadLink.download = "cropped.png";
downloadLink.href = resultCanvas.toDataURL("image/png");
downloadLink.click();
}
</script >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YUJIANYUE

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

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

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

打赏作者

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

抵扣说明:

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

余额充值