【发布时间】:2020-07-04 02:23:35
【问题描述】:
我使用 FabricJS 和 clipPath 属性实现了图像裁剪。
问题是如何使图像在裁剪后适合画布?我希望裁剪后的图像填充画布区域,但不知道是否可以使用fabric js。
所以我希望用户单击裁剪按钮后图像的选定部分适合画布大小:
关于代码:我在画布上画了一个矩形,用户可以调整大小和移动它。之后,用户可以单击裁剪按钮并获得裁剪后的图像。但是裁剪后的部分保持与原始图像相同的大小,而我希望它可以缩放并适合画布。
注意:我尝试使用 scaleToWidth 等方法。此外,我将选择矩形的 absolutePositioned 设置为 true。我尝试将此属性设置为 false 来缩放到图像,但没有帮助。
请不要建议使用cropX 和cropY 属性代替clipPath 进行裁剪,因为它们不适用于旋转图像。
HTML:
<button>Crop</button>
<canvas id="canvas" width="500" height="500"></canvas>
JS:
// crop button
var button = $("button");
// handle click
button.on("click", function(){
let rect = new fabric.Rect({
left: selectionRect.left,
top: selectionRect.top,
width: selectionRect.getScaledWidth(),
height: selectionRect.getScaledHeight(),
absolutePositioned: true
});
currentImage.clipPath = rect;
canvas.remove(selectionRect);
canvas.renderAll();
});
var canvas = new fabric.Canvas('canvas');
canvas.preserveObjectStacking = true;
var selectionRect;
var currentImage;
fabric.Image.fromURL('https://www.sheffield.ac.uk/polopoly_fs/1.512509!/image/DiamondBasement.jpg', img => {
img.scaleToHeight(500);
img.selectable = true;
canvas.add(img);
canvas.centerObject(img);
currentImage = img;
canvas.backgroundColor = "#333";
addSelectionRect();
canvas.setActiveObject(selectionRect);
canvas.renderAll();
});
function addSelectionRect() {
selectionRect = new fabric.Rect({
fill: 'rgba(0,0,0,0.3)',
originX: 'left',
originY: 'top',
stroke: 'black',
opacity: 1,
width: currentImage.width,
height: currentImage.height,
hasRotatingPoint: false,
transparentCorners: false,
cornerColor: 'white',
cornerStrokeColor: 'black',
borderColor: 'black',
});
selectionRect.scaleToWidth(300);
canvas.centerObject(selectionRect);
selectionRect.visible = true;
canvas.add(selectionRect);
}
这是我的 jsfiddle:https://jsfiddle.net/04nvdeb1/23/
【问题讨论】:
-
剪裁区域必须是绝对的吗?或者那是你尝试过的东西?与剪切区域相比,您希望图像可移动吗?
-
@AndreaBogazzi,感谢您对此进行调查!剪裁区域不一定是绝对的,我想我把它设为绝对是为了简化计算。理想情况下,当图像移动时,剪切区域应该“固定”到图像上。另外,我需要有一个旋转图像的功能,所以剪辑也应该适用于旋转的图像。
-
剪辑也适用于旋转的图像,只是你反向旋转剪辑区域。
标签: javascript image image-processing fabricjs crop