美文网首页
js——canvas——固定方形裁剪

js——canvas——固定方形裁剪

作者: 弦生_a3a3 | 来源:发表于2023-09-21 10:15 被阅读0次

案例图片展示:

image.png

代码块:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    #cvs{
        margin: 100px;
    }
</style>
<body>
    <div style="margin-bottom: 10px">
        上传图片:<input type="file" onchange="onChange(this.files[0])">
    </div>
    <canvas id="cvs"></canvas>
    <canvas id="clipCvs"></canvas>
    <button id="download">下载图片</button>
<script>
const cvs = document.getElementById('cvs');
const clipCvs = document.getElementById('clipCvs');
const ctx = cvs.getContext('2d');
const download = document.getElementById('download');
const clipCtx = clipCvs.getContext('2d')
const img = new Image();
let maxW = 600;
let maxH = 0;
let p={
        x:0,
        y:0,
        boxX:0,
        boxY:0,
        move:false
},rects=null;
 const onChange = (file)=>{
    
     init(URL.createObjectURL(file));
 }  
 const init = (src) =>{
     img.src = src;
     img.onload = () =>{
         p.x = 0;
         p.y = 0;
         let w1 = img.width;
         let h1 = img.height;
         if(w1>maxW){
             h1 = maxW/w1 * h1;
             maxH = h1;
             w1 = maxW;
         }
         cvs.width = w1;
         cvs.height = h1;
         render();
     }
    console.log("src",src)
 }

 const render = (left=0,top=0) =>{
    ctx.clearRect(0,0,cvs.width,cvs.height);
    ctx.drawImage(img,0,0,cvs.width,cvs.height);
    ctx.beginPath();
    p.x = left;
    p.y = top;
    let dataImg = ctx.getImageData(left,top,maxW/4,maxW/4);
    clipPic(dataImg);
    ctx.fillStyle='rgba(0,0,0,.5)';
    rects = ctx.fillRect(left,top,maxW/4,maxW/4);
  
 };
 const clipPic = (data) =>{
    clipCtx.clearRect(0,0,maxW,maxH);
    clipCtx.putImageData(data,0,0);
 }
 cvs.addEventListener('mousedown',({clientX,clientY})=>{
     let offsetX = cvs.offsetLeft;
     let offsetY = cvs.offsetTop;
     let innerX = clientX - offsetX;
     let innerY = clientY - offsetY;
     if(innerX<(p.x+(maxW/4)) && innerX>=p.x && innerY<(p.y+(maxW/4)) && innerY>=p.y){
         console.log("范围内",innerY,rects)
         p.boxX = innerX - p.x;
         p.boxY = innerY - p.y;
         p.move = true;
     }
     console.log('e',offsetX,offsetY,innerX,maxW/4)
 });
 cvs.addEventListener('mousemove',({clientX,clientY})=>{
    if(p.move){
        let x = clientX - cvs.offsetLeft  - p.boxX;
        let y = clientY - cvs.offsetTop  - p.boxY;
        if(x<0) x = 0;
        if(y<0) y = 0;
        if(x>(maxW - (maxW/4))) x=(maxW - (maxW/4));
        if(y>(maxH - (maxW/4))) y=(maxH - (maxW/4));
        render(x,y);
    }
 });
 cvs.addEventListener('mouseleave',({clientX,clientY})=>{
    if(p.move){
        p.move = false;
    }
 });
 cvs.addEventListener('mouseup',({clientX,clientY})=>{
    if(p.move){
        p.move = false;
    }
 });
 download.onclick = async () => {
        const res = await fetch(clipCvs.toDataURL('image/png'))
        const blob = await res.blob();
        const a = document.createElement('a')
        a.setAttribute('download', 'clip.png')
        a.href = URL.createObjectURL(blob)
        a.click()
 }
</script>
</body>
</html>

作者太懒了都不想解释,仔细斟酌

相关文章

网友评论

      本文标题:js——canvas——固定方形裁剪

      本文链接:https://www.haomeiwen.com/subject/uqqzvdtx.html