gpt4 book ai didi

javascript - 使用 FabricJs 的裁剪功能

转载 作者:行者123 更新时间:2023-12-02 22:37:44 25 4
gpt4 key购买 nike

如何使用fabric.js在 Canvas 上加载的图像上实现裁剪工具?我在 Canvas 上加载了一个图像。现在我想实现裁剪工具,允许用户裁剪图像并在完成后将其重新加载到 Canvas 上。

最佳答案

(这个答案是对 Tom's 答案中的 fiddle 的迭代。谢谢你,汤姆,让我走上这条路。)

您可以使用 fabric.Object.clipTo() 在 Fabric.js 中进行裁剪或fabric.Object.toDataURL()clipTo() 方法保留原始图像并通过蒙版显示裁剪。 toDataURL() 方法创建一个新图像。

我的完整示例使用 clipTo() 方法。我在最后添加了一小段代码,显示了 toDataURL() 方法。

解决方案1

摘要

  1. 准备一个不可见的矩形。当用户在 Canvas 上单击并拖动鼠标时绘制它。
  2. 当用户释放鼠标单击时,剪裁底层图像

与汤姆的回答不同

在汤姆的回答中,有一些小事情我想改变。所以在我的例子中差异是

  1. 裁剪框从左到右和从右到左工作(Tom 的工作仅从右到左)

  2. 您有不止一次机会绘制裁剪框(尝试在 Tom 中重新绘制裁剪框会导致框跳转)

  3. 适用于 Fabric.js v1.5.0

  4. 更少的代码。

代码

 // set to the event when the user pressed the mouse button down
var mouseDown;
// only allow one crop. turn it off after that
var disabled = false;
var rectangle = new fabric.Rect({
fill: 'transparent',
stroke: '#ccc',
strokeDashArray: [2, 2],
visible: false
});
var container = document.getElementById('canvas').getBoundingClientRect();
var canvas = new fabric.Canvas('canvas');
canvas.add(rectangle);
var image;
fabric.util.loadImage("http://fabricjs.com/lib/pug.jpg", function(img) {
image = new fabric.Image(img);
image.selectable = false;
canvas.setWidth(image.getWidth());
canvas.setHeight(image.getHeight());
canvas.add(image);
canvas.centerObject(image);
canvas.renderAll();
});
// capture the event when the user clicks the mouse button down
canvas.on("mouse:down", function(event) {
if(!disabled) {
rectangle.width = 2;
rectangle.height = 2;
rectangle.left = event.e.pageX - container.left;
rectangle.top = event.e.pageY - container.top;
rectangle.visible = true;
mouseDown = event.e;
canvas.bringToFront(rectangle);
}
});
// draw the rectangle as the mouse is moved after a down click
canvas.on("mouse:move", function(event) {
if(mouseDown && !disabled) {
rectangle.width = event.e.pageX - mouseDown.pageX;
rectangle.height = event.e.pageY - mouseDown.pageY;
canvas.renderAll();
}
});
// when mouse click is released, end cropping mode
canvas.on("mouse:up", function() {
mouseDown = null;
});
$('#cropB').on('click', function() {
image.clipTo = function(ctx) {
// origin is the center of the image
var x = rectangle.left - image.getWidth() / 2;
var y = rectangle.top - image.getHeight() / 2;
ctx.rect(x, y, rectangle.width, rectangle.height);
};
image.selectable = true;
disabled = true;
rectangle.visible = false;
canvas.renderAll();
});
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js" type="text/javascript"></script>
</head>
<body>
<canvas style="border: 1px solid black" id="canvas"></canvas>
<button id=cropB>crop</button>
</body>

解决方案2

或者,我们可以使用 toDataURL() 生成新图像,而不是像上面那样使用 clipTo()。像这样的东西

$('#cropB').on('click', function() {
image.selectable = true;
disabled = true;
rectangle.visible = false;
var cropped = new Image();
cropped.src = canvas.toDataURL({
left: rectangle.left,
top: rectangle.top,
width: rectangle.width,
height: rectangle.height
});
cropped.onload = function() {
canvas.clear();
image = new fabric.Image(cropped);
image.left = rectangle.left;
image.top = rectangle.top;
image.setCoords();
canvas.add(image);
canvas.renderAll();
};
});

关于javascript - 使用 FabricJs 的裁剪功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18732876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com