【发布时间】:2020-11-13 03:00:42
【问题描述】:
我正在使用 FabricJS 在我身边实现设计器功能。我的想法是使用fabric中的setBackgroundImage设置背景图像,我还添加了透明矩形的特定区域,其大小和位置来自JCrop。现在来问我的问题,我想将对象放置限制在透明矩形的特定区域内。假设我想添加应该在该有限区域内的文本/图像/形状,我能够实现背景图像、透明矩形的位置甚至圆形对象,但我无法找到限制对象的细节将其放置在透明矩形内并且只在那个地区。
这是我下面的代码和工作fiddle,如果您在需要选择裁剪部分的图像中看到它,并且在该画布背景下方使用透明矩形,这与裁剪选择相同。现在我想限制对象放置在透明矩形中,现在我可以将对象放置在画布中的任何位置。
HTML
<img src="https://images.unsplash.com/photo-1595438337199-d50ba5072c7e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=330&q=80" id="target">
<div class="canvas-container" style="position: relative; user-select: none;">
<canvas id="c1" width="600" height="600" style="border:1px solid #ccc; position: absolute; left: 0px; top: 0px; touch-action: none; user-select: none;"></canvas>
</div>
JS
function calculateAspectRatioFit(srcWidth, srcHeight, maxWidth, maxHeight) {
var ratio = Math.min(maxWidth / srcWidth, maxHeight / srcHeight);
return {
width: srcWidth * ratio,
height: srcHeight * ratio,
aspectratio: ratio
};
}
jQuery(function($) {
//alert("Testing");
var img = new Image();
img.onload = function() {
var data = calculateAspectRatioFit(this.width, this.height, '400', '600');
console.log(data);
jQuery('#target').attr('width', data.width);
jQuery('#target').attr('height', data.height);
jQuery('#pdr-drawing-area').html("Aspect Ratio: " + data.aspectratio);
const stage = Jcrop.attach('target');
stage.listen('crop.change', function(widget, e) {
const pos = widget.pos;
console.log(pos.x, pos.y, pos.w, pos.h);
//fabric js
var canvas = new fabric.Canvas('c1');
var center = canvas.getCenter();
var img = 'https://images.unsplash.com/photo-1595438337199-d50ba5072c7e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=330&q=80';
canvas.setBackgroundImage(img, function() {
canvas.backgroundImage && canvas.backgroundImage.scaleToWidth(data.width);
canvas.backgroundImage && canvas.backgroundImage.scaleToHeight(data.height);
//canvas.sendToBack(img);
canvas.renderAll();
});
console.log(pos.x * data.aspectratio);
var rect = new fabric.Rect({
left: pos.x,
top: pos.y,
fill: 'transparent',
width: (pos.w),
height: (pos.h),
strokeDashArray: [5, 5],
stroke: "black",
selectable: false,
evented: false,
//visible: false
});
canvas.add(new fabric.Circle({
radius: 30,
fill: '#f55',
top: pos.y + 2,
left: pos.x + 2
}));
canvas.add(rect);
canvas.setHeight(data.height);
canvas.setWidth(data.width);
canvas.renderAll();
});
},
img.src = 'https://images.unsplash.com/photo-1595438337199-d50ba5072c7e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=330&q=80';
});
【问题讨论】:
-
您要求在这种情况下将 FabricJS 对象限制为 Circle 到某些边界...您可以将您的代码示例简化为这样吗?
-
仔细查看您的代码...您真的没有尝试任何限制或检测画布中的移动,开始您需要
canvas.on("object:moving" ... -
对象在画布上是如何放置的?用户是要在点击事件上添加一些东西,还是您只是有一个对象并需要计算放置它的位置?是放置问题还是您正在寻找解决方案以在有限的边界内移动对象?
-
@AdamM。看看小提琴,当用户从小提琴中设置“JCrop”中的区域时,对象会以编程方式添加到画布中,看起来一切都正确完成。 _ 问题似乎与“限制对象放置”部分有关……但 Vignesh 没有提供任何反馈
-
@HelderSepulveda 谢谢你的钥匙,因为我没有尝试过任何有限制的部分,我认为有一些本机可用的东西。您的回答对实现预期结果有很大帮助。
标签: javascript canvas html5-canvas fabricjs