javascript - HTML5 Canvas 非矩形部分裁剪并保存图像

标签 javascript html image canvas

在过去的几天里,我一直在尝试以用户想要的方式裁剪图像......我需要为用户提供一个用户界面,他可以通过绘制圆圈或剪切图像的一部分通过加入点...所以我发现了一个 fiddle ,用户可以在其中绘制点,当他单击“生成”按钮时,图像将使用他想要裁剪的部分创建......但是当我尝试获取 dataUrl 属性时新生成的 Canvas 具有裁剪后的图像,它给我错误,显示“安全错误:操作不安全。”

我想要新生成的 Canvas 的 dataUrl 属性,以便我可以获得 base64 值并将新裁剪的图像保存到文件夹中...有什么方法可以克服这个错误...我已经盯着了错误,但没有得到任何解决方案......我知道的一件事是它的某些标志设置为关闭 Canvas ,这就是为什么我无法获取 datUrl 属性

这是 fiddle [ http://jsfiddle.net/MFELx/]其中有演示,我们可以通过单击图像上的点来裁剪图像......您可以更新此 fiddle 以获取新生成的 Canvas 的 dataUrl 属性或任何其他方法也将受到赞赏

以下是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>

以下是脚本

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(); 
});

感谢先进的家伙

最佳答案

"Security Error: The operation is insecure."

您不能使用来自其他域的图像作为 Canvas ,只能使用来自原始域的图像。 在这里阅读相关内容 http://www.w3.org/TR/cors/#resource-sharing-check-0 (CORS)。

关于javascript - HTML5 Canvas 非矩形部分裁剪并保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23844063/

相关文章:

php - 提交带有空复选框的 HTML 表单

javascript - Accordion 在 Foundation 中不起作用

image - Photoshop 脚本将文件名作为文本添加到图像,但删除前两个字符

javascript - 为什么 html canvas 动画会为每个新矩形渲染一个临时间隙?

javascript - 删除关联中的所有对象

javascript - Uncaught ReferenceError : Parse is not defined

html - 覆盖部分 CSS 垂直 Accordion 的宽度

image - DecorationImage 不显示图像 - Flutter

C# GDI+ 图像调整大小函数

JavaScript 在 Firefox 3 中异步加载(根据 Firebug)?