Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 适合并防止图像在画布内的位置_Javascript_Html_Canvas_Frontend_Fabricjs - Fatal编程技术网

Javascript 适合并防止图像在画布内的位置

Javascript 适合并防止图像在画布内的位置,javascript,html,canvas,frontend,fabricjs,Javascript,Html,Canvas,Frontend,Fabricjs,我有一个页面,可以让你在画布元素中插入一个图像,效果非常好 现在,我需要的是一种防止图像在画布中定位的方法,不允许留下空白,不管图像的位置如何 图像选择选项处于活动状态。使用拖放操作完成重新定位。我使用fabric js来定位图像 我需要的东西,如图像缩放,但我需要有一个固定大小的画布,图像将大于画布 画布 <canvas id="c" height="300" width="200"></canvas> 我可以修改您的第二个示例,使其符合您的要求 下面是修改后的sc

我有一个页面,可以让你在画布元素中插入一个图像,效果非常好

现在,我需要的是一种防止图像在画布中定位的方法,不允许留下空白,不管图像的位置如何

图像选择选项处于活动状态。使用拖放操作完成重新定位。我使用fabric js来定位图像

我需要的东西,如图像缩放,但我需要有一个固定大小的画布,图像将大于画布

画布

<canvas id="c" height="300" width="200"></canvas>

我可以修改您的第二个示例,使其符合您的要求

下面是修改后的script.js

var canvas = window._canvas = new fabric.Canvas('canvas', {
    preserveObjectStacking: true
});

var imageObj = new Image(), path = 'http://i.imgur.com/tEeSJcr.jpg';

imageObj.src = path;

imageObj.onload = function () {
    var image = new fabric.Image(imageObj);

    canvas.setHeight(250);
    canvas.setWidth(250);
    image.set({
        id: 'img',
        left: 0,
        top: 0,
        selectable: true,
        hasBorders: false,
        hasControls: false,
        hasRotatingPoint: false
    });
    canvas.add(image);
};


canvas.on('object:moving', function (e) {
    var obj;
    obj = e.target;
    obj.setCoords();

    var boundingRect = obj.getBoundingRect();
    var zoom = canvas.getZoom();
    var viewportMatrix = canvas.viewportTransform;

    //there is a bug in fabric that causes bounding rects to not be transformed by viewport matrix
    //this code should compensate for the bug for now
    boundingRect.top = (boundingRect.top - viewportMatrix[5]) / zoom;
    boundingRect.left = (boundingRect.left - viewportMatrix[4]) / zoom;
    boundingRect.width /= zoom;
    boundingRect.height /= zoom;

    var canvasHeight = obj.canvas.height / zoom,
        canvasWidth = obj.canvas.width / zoom;

    if(boundingRect.top > 0){
        obj.top = 0;
    }

    if(boundingRect.left > 0){
        obj.left = 0;
    }

    if (boundingRect.top < canvasHeight - boundingRect.height){
        obj.top = canvasHeight - boundingRect.height;
    }

    if (boundingRect.left < canvasWidth - boundingRect.width){
        obj.left = canvasWidth - boundingRect.width;
    }

});

$('#zoomIn').click(function () {
    if (canvas.getZoom() < 3) {
        canvas.setZoom(canvas.getZoom() + 0.1);
    }
});

$('#zoomOut').click(function () {
    if (canvas.getZoom() !== 1) {
        canvas.setZoom(canvas.getZoom() - 0.1);
    }
});
var canvas=window.\u canvas=new fabric.canvas('canvas'){
对:对
});
var imageObj=新图像(),路径=http://i.imgur.com/tEeSJcr.jpg';
imageObj.src=路径;
imageObj.onload=函数(){
var image=新的fabric.image(imageObj);
画布设置高度(250);
画布。设置宽度(250);
image.set({
id:‘img’,
左:0,,
排名:0,
是的,
哈斯:错,
哈斯:错,
hasRotatingPoint:false
});
canvas.add(图像);
};
canvas.on('object:moving',function(e){
var-obj;
obj=e.target;
obj.setCoords();
var boundingRect=obj.getBoundingRect();
var zoom=canvas.getZoom();
var viewportMatrix=canvas.viewportTransform;
//fabric中存在一个缺陷,导致边界矩形不能通过视口矩阵进行变换
//这段代码现在应该可以弥补这个错误
boundingRect.top=(boundingRect.top-viewportMatrix[5])/zoom;
boundingRect.left=(boundingRect.left-viewportMatrix[4])/zoom;
boundingRect.width/=缩放;
boundingRect.height/=缩放;
var canvasHeight=obj.canvas.height/zoom,
画布宽度=obj.canvas.width/缩放;
如果(boundingRect.top>0){
obj.top=0;
}
如果(boundingRect.left>0){
obj.left=0;
}
if(boundingRect.top<画布高度-boundingRect.height){
obj.top=画布高度-boundingRect.height;
}
if(boundingRect.left<画布宽度-boundingRect.width){
obj.left=画布宽度-boundingRect.width;
}
});
$(“#缩放”)。单击(函数(){
if(canvas.getZoom()<3){
canvas.setZoom(canvas.getZoom()+0.1);
}
});
$('#zoomOut')。单击(函数(){
if(canvas.getZoom()!==1){
canvas.setZoom(canvas.getZoom()-0.1);
}
});
这是你的电话号码

关于解决方案的一些解释:为了防止图像边框在画布内被拖动,需要约束其顶部和左侧位置。画布的左上角位置以(0,0)开始,并从上到下和从左到右增加值。要约束图像的顶部,请检查其位置(obj.top)是否大于0,如果大于0,只需将其更改回0即可。这同样适用于左侧。 对于右侧和底部,它有一点不同,因为在对象上没有要检查的左侧和右侧属性。要解决这个问题,您只需要计算顶部和左侧值可以达到的最大负数,这是通过从图像高度减去画布高度来获得顶部值和左侧图像宽度的画布宽度来完成的,如果值减少的幅度大于此值,您只需将其设置回您计算的值。例如:对于200x200画布和250x250图像,顶部和左侧的值为-50将防止图像被拖动到内部


我可以修改您的第二个示例,使其符合您的要求

下面是修改后的script.js

var canvas = window._canvas = new fabric.Canvas('canvas', {
    preserveObjectStacking: true
});

var imageObj = new Image(), path = 'http://i.imgur.com/tEeSJcr.jpg';

imageObj.src = path;

imageObj.onload = function () {
    var image = new fabric.Image(imageObj);

    canvas.setHeight(250);
    canvas.setWidth(250);
    image.set({
        id: 'img',
        left: 0,
        top: 0,
        selectable: true,
        hasBorders: false,
        hasControls: false,
        hasRotatingPoint: false
    });
    canvas.add(image);
};


canvas.on('object:moving', function (e) {
    var obj;
    obj = e.target;
    obj.setCoords();

    var boundingRect = obj.getBoundingRect();
    var zoom = canvas.getZoom();
    var viewportMatrix = canvas.viewportTransform;

    //there is a bug in fabric that causes bounding rects to not be transformed by viewport matrix
    //this code should compensate for the bug for now
    boundingRect.top = (boundingRect.top - viewportMatrix[5]) / zoom;
    boundingRect.left = (boundingRect.left - viewportMatrix[4]) / zoom;
    boundingRect.width /= zoom;
    boundingRect.height /= zoom;

    var canvasHeight = obj.canvas.height / zoom,
        canvasWidth = obj.canvas.width / zoom;

    if(boundingRect.top > 0){
        obj.top = 0;
    }

    if(boundingRect.left > 0){
        obj.left = 0;
    }

    if (boundingRect.top < canvasHeight - boundingRect.height){
        obj.top = canvasHeight - boundingRect.height;
    }

    if (boundingRect.left < canvasWidth - boundingRect.width){
        obj.left = canvasWidth - boundingRect.width;
    }

});

$('#zoomIn').click(function () {
    if (canvas.getZoom() < 3) {
        canvas.setZoom(canvas.getZoom() + 0.1);
    }
});

$('#zoomOut').click(function () {
    if (canvas.getZoom() !== 1) {
        canvas.setZoom(canvas.getZoom() - 0.1);
    }
});
var canvas=window.\u canvas=new fabric.canvas('canvas'){
对:对
});
var imageObj=新图像(),路径=http://i.imgur.com/tEeSJcr.jpg';
imageObj.src=路径;
imageObj.onload=函数(){
var image=新的fabric.image(imageObj);
画布设置高度(250);
画布。设置宽度(250);
image.set({
id:‘img’,
左:0,,
排名:0,
是的,
哈斯:错,
哈斯:错,
hasRotatingPoint:false
});
canvas.add(图像);
};
canvas.on('object:moving',function(e){
var-obj;
obj=e.target;
obj.setCoords();
var boundingRect=obj.getBoundingRect();
var zoom=canvas.getZoom();
var viewportMatrix=canvas.viewportTransform;
//fabric中存在一个缺陷,导致边界矩形不能通过视口矩阵进行变换
//这段代码现在应该可以弥补这个错误
boundingRect.top=(boundingRect.top-viewportMatrix[5])/zoom;
boundingRect.left=(boundingRect.left-viewportMatrix[4])/zoom;
boundingRect.width/=缩放;
boundingRect.height/=缩放;
var canvasHeight=obj.canvas.height/zoom,
画布宽度=obj.canvas.width/缩放;
如果(boundingRect.top>0){
obj.top=0;
}
如果(boundingRect.left>0){
obj.left=0;
}
if(boundingRect.top<画布高度-boundingRect.height){
obj.top=画布高度-boundingRect.height;
}
if(boundingRect.left<画布宽度-boundingRect.width){
obj.left=画布宽度-boundingRect.width;
}
});
$(“#缩放”)。单击(函数(){
if(canvas.getZoom()<3){
canvas.setZoom(canvas.getZoom()+0.1);
}
});
$('#zoomOut')。单击(函数(){
if(canvas.getZoom()!==1){
canvas.setZoom(canvas.getZoom()-0.1);
}
});
这是你的电话号码

关于解决方案的一些解释:为了防止图像边框在画布内被拖动,需要约束其顶部和左侧位置。画布的左上角位置以(0,0)开始,并从上到下和从左到右增加值。若要约束所创建图像的顶部,请执行以下操作:
var canvas = window._canvas = new fabric.Canvas('canvas', {
    preserveObjectStacking: true
});

var imageObj = new Image(), path = 'http://i.imgur.com/tEeSJcr.jpg';

imageObj.src = path;

imageObj.onload = function () {
    var image = new fabric.Image(imageObj);

    canvas.setHeight(250);
    canvas.setWidth(250);
    image.set({
        id: 'img',
        left: 0,
        top: 0,
        selectable: true,
        hasBorders: false,
        hasControls: false,
        hasRotatingPoint: false
    });
    canvas.add(image);
};


canvas.on('object:moving', function (e) {
    var obj;
    obj = e.target;
    obj.setCoords();

    var boundingRect = obj.getBoundingRect();
    var zoom = canvas.getZoom();
    var viewportMatrix = canvas.viewportTransform;

    //there is a bug in fabric that causes bounding rects to not be transformed by viewport matrix
    //this code should compensate for the bug for now
    boundingRect.top = (boundingRect.top - viewportMatrix[5]) / zoom;
    boundingRect.left = (boundingRect.left - viewportMatrix[4]) / zoom;
    boundingRect.width /= zoom;
    boundingRect.height /= zoom;

    var canvasHeight = obj.canvas.height / zoom,
        canvasWidth = obj.canvas.width / zoom;

    if(boundingRect.top > 0){
        obj.top = 0;
    }

    if(boundingRect.left > 0){
        obj.left = 0;
    }

    if (boundingRect.top < canvasHeight - boundingRect.height){
        obj.top = canvasHeight - boundingRect.height;
    }

    if (boundingRect.left < canvasWidth - boundingRect.width){
        obj.left = canvasWidth - boundingRect.width;
    }

});

$('#zoomIn').click(function () {
    if (canvas.getZoom() < 3) {
        canvas.setZoom(canvas.getZoom() + 0.1);
    }
});

$('#zoomOut').click(function () {
    if (canvas.getZoom() !== 1) {
        canvas.setZoom(canvas.getZoom() - 0.1);
    }
});