How to select a polygonal area of an image using JavaScript / jQuery?

前端 未结 2 1929
醉梦人生
醉梦人生 2020-12-30 10:51

I\'d like to be able to let my users select a specific polygonal (6-8 vertices with curved lines between points) area of an image they upload - how do I go about doing this

相关标签:
2条回答
  • 2020-12-30 11:24

    There's already a library that does part of what you need: polyclip.js, by Zoltan Dulac You can build a UI that allows the user to select points, then feed the data to the library and you're done.

    EDIT: Here is a jsFiddle demonstration. Click to select points on the original image and press the Generate button to generate a cropped version.

    HTML:

    <div id="mainContent">
        <div id="canvasDiv">
            <br/>
            <button id="generate" type="button">Generate
            </button> 
        </div>
        <h1>Result:</h1>
        <div class="clipParent" style="float:left;"> 
        </div> 
    </div>
    

    JS:

    var canvasDiv = document.getElementById('canvasDiv'); 
    canvas = document.createElement('canvas'); 
    canvas.setAttribute('width', 500); 
    canvas.setAttribute('height', 500); 
    canvas.setAttribute('id', 'canvas'); 
    $(canvasDiv).prepend(canvas); 
    if(typeof G_vmlCanvasManager != 'undefined') { 
        canvas = G_vmlCanvasManager.initElement(canvas); 
    } 
    
    var context = canvas.getContext('2d'); 
    var imageObj = new Image(); 
    
    imageObj.onload = function() {
        $(canvas).attr({width : this.width, height: this.height});
        context.drawImage(imageObj,0,0); 
    }; 
    imageObj.src = 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg'; 
    
    var clickX = new Array(); 
    var clickY = new Array(); 
    var clickDrag = new Array(); 
    var paint; 
    
    function addClick(x, y, dragging) 
    { 
        clickX.push(x); 
        clickY.push(y); 
        clickDrag.push(dragging); 
    } 
    
    function redraw(){ 
        canvas.width = canvas.width; // Clears the canvas 
        context.drawImage(imageObj,0,0); 
    
        context.strokeStyle = "#df4b26"; 
        context.lineJoin = "round"; 
        context.lineWidth = 5; 
    
        for(var i=0; i < clickX.length; i++) 
        { 
        context.beginPath(); 
        context.arc(clickX[i], clickY[i], 3, 0, 2 * Math.PI, false); 
        context.fillStyle = '#ffffff'; 
        context.fill(); 
        context.lineWidth = 5; 
        context.stroke(); 
        } 
    } 
    
    $('#canvas').click(function(e){ 
        var mouseX = e.pageX - this.offsetLeft; 
        var mouseY = e.pageY - this.offsetTop; 
    
        addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop); 
        redraw(); 
    }); 
    
    $('#generate').click(function(){ 
        $(".clipParent").empty(); 
        $(".clipParent").prepend('<img src="http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg" id="genimg" />'); 
        var arr = []; 
        for(var i=0; i < clickX.length; i++){ 
            arr.push(clickX[i]); 
            arr.push(clickY[i]); 
        } 
        $("#genimg")[0].setAttribute("data-polyclip",arr.join(", ")); 
        clickX=[]; 
        clickY=[]; 
        redraw(); 
        polyClip.init(); 
    });
    
    0 讨论(0)
  • 2020-12-30 11:32

    You could load the image on to a canvas tag and then you can do all the drawing you like on that canvas.

    0 讨论(0)
提交回复
热议问题