Javascript Fabricjs objectCaching:缩放图像内容,保留图像边框

Javascript Fabricjs objectCaching:缩放图像内容,保留图像边框,javascript,image,zooming,fabricjs,Javascript,Image,Zooming,Fabricjs,我尝试用fabricjs实现图像缩放。我的要求:缩放图像内容而不改变边框大小(不缩放图像) 这是我的代码: 按照这种方式,我需要将rect的objectCaching设置为false。但在运动图像处理时,会产生较大的性能问题。所以我在缩放模式下将objectCaching设置为false,在其他模式下设置为true。然后我遇到了另一个问题,在缩放图像后,将objectCaching更改为true和false会使图像的内容发生更改 如何在更改objectCaching时保持图像内容不变?您选择在缩

我尝试用fabricjs实现图像缩放。我的要求:缩放图像内容而不改变边框大小(不缩放图像)

这是我的代码:

按照这种方式,我需要将rect的objectCaching设置为false。但在运动图像处理时,会产生较大的性能问题。所以我在缩放模式下将objectCaching设置为false,在其他模式下设置为true。然后我遇到了另一个问题,在缩放图像后,将objectCaching更改为true和false会使图像的内容发生更改


如何在更改objectCaching时保持图像内容不变?

您选择在缩放时显示图像的方式非常繁重。 有一种更快的方法不需要所有这些图纸

解决方案包括在新画布上创建图案。 画布创作 在画布上绘制图像 模式创建 使用缓存绘制矩形

这是一个更简单的解决方案,不涉及模式或缓存

它包括使用自定义zoomLevel属性和ctx.drawImage()的完整签名重写fabric.Image render方法,使其行为不同

fabric.Image.prototype.\u render=function(ctx){
var fwidth=此._元素宽度/(此.zoomLevel+1);
var FHHEIGH=此._元素高度/(此.zoomLevel+1);
var wdiff=(fwidth-this._element.width)/2;
var hdiff=(fheight-此元素高度)/2;
ctx.drawImage(此.u元素,-wdiff,-hdiff,fwidth,fhheight,-this.width/2,-this.height/2,this.width,this.height);
}
var canvas=this.\uu canvas=newfabric.canvas('c');
fabric.Image.fromURL(“https://images2.alphacoders.com/147/147320.png,功能(img){
var zoomLevel=0;
var zoomLevelMin=0;
var zoomLevelMax=3;
img.zoomLevel=0
模拟量表(0.1);
canvas.add(img);
img.zoomIn=函数(){
if(zoomLevel=zoomLevelMin){
img.zoomLevel=zoomLevel;
}
};
});
canvas.on('mouse:wheel',函数(选项){
var imgObj=canvas.getActiveObject();
如果(!imgObj)返回;
选项e.preventDefault();
如果(选项e.deltaY>0){
imgObj.zoomOut();
}否则{
imgObj.zoomIn();
}
canvas.renderAll();
});

FabricJS图像助手


您选择在缩放时显示图像的方式非常繁重。 有一种更快的方法不需要所有这些图纸

解决方案包括在新画布上创建图案。 画布创作 在画布上绘制图像 模式创建 使用缓存绘制矩形

这是一个更简单的解决方案,不涉及模式或缓存

它包括使用自定义zoomLevel属性和ctx.drawImage()的完整签名重写fabric.Image render方法,使其行为不同

fabric.Image.prototype.\u render=function(ctx){
var fwidth=此._元素宽度/(此.zoomLevel+1);
var FHHEIGH=此._元素高度/(此.zoomLevel+1);
var wdiff=(fwidth-this._element.width)/2;
var hdiff=(fheight-此元素高度)/2;
ctx.drawImage(此.u元素,-wdiff,-hdiff,fwidth,fhheight,-this.width/2,-this.height/2,this.width,this.height);
}
var canvas=this.\uu canvas=newfabric.canvas('c');
fabric.Image.fromURL(“https://images2.alphacoders.com/147/147320.png,功能(img){
var zoomLevel=0;
var zoomLevelMin=0;
var zoomLevelMax=3;
img.zoomLevel=0
模拟量表(0.1);
canvas.add(img);
img.zoomIn=函数(){
if(zoomLevel=zoomLevelMin){
img.zoomLevel=zoomLevel;
}
};
});
canvas.on('mouse:wheel',函数(选项){
var imgObj=canvas.getActiveObject();
如果(!imgObj)返回;
选项e.preventDefault();
如果(选项e.deltaY>0){
imgObj.zoomOut();
}否则{
imgObj.zoomIn();
}
canvas.renderAll();
});

FabricJS图像助手


它不能解决我的问题。但它比我的实现更简单、更快。伟大的非常感谢@AndreaBogazzi。所以我可能没有理解你的问题。你能解释清楚吗?谢谢,我觉得这非常有用。我只是想问一下,放大后是否可以平移图像。任何想法。怎样。特别是按住shift键或中键单击。这将使它非常适合于图像的快速成帧。我认为,对于最新的织物,您只需使用裁剪功能就可以做到这一点。允许您选择图像的一部分。这不能解决我的问题。但它比我的实现更简单、更快。伟大的非常感谢@AndreaBogazzi。所以我可能没有理解你的问题。你能解释清楚吗?谢谢,我觉得这非常有用。我只是想问一下,放大后是否可以平移图像。任何想法。怎样。特别是按住shift键或中键单击。这将使它非常适合于图像的快速成帧。我认为,对于最新的织物,您只需使用裁剪功能就可以做到这一点。允许您选择图像的一部分。