微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我已经使用Clipping Now我想限制图像在布料Js中穿过矩形的右上角或矩形的底部后的移动

如何解决我已经使用Clipping Now我想限制图像在布料Js中穿过矩形的右上角或矩形的底部后的移动

我是Fabric的新手,我为图像创建了一个矩形形状和clipTo函数,现在我想将图像限制在形状区域中。顶部和左侧工作正常,但右侧和底部不平滑。请帮助

https://jsfiddle.net/mg73n0eq/154/#&togetherjs=Qh6LnTRHFq

let canvas = new fabric.Canvas(
"ast",{
        width: 400,height: 400,selection: true,id: "ast",//selectionBorderColor: "green",backgroundColor: "#ffffff",preserveObjectStacking: true,uniScaleTransform: true,//cornerSize: 40,lockScalingFlip: true,controlsAboveOverlay: true,subTargetCheck: true,hoverCursor: "pointer",stateful: true,},null,"anonymous"
    );
    
   var Rect = new fabric.Rect({
    width: 250,height: 250,fixed: true,fill: "#000",scaleX: 1,scaleY: 1,top:0,left:0,maskname: "rect",absolutePositioned: true,stroke: "1",lockUniScaling: true,minScaleLimit: 0.1,});

 canvas.add(Rect);

 function rectMask(canvas) {
 
  //Rect.viewportCenter();
  
  
  let pugImg = new Image();
  pugImg.crossOrigin = "anonymous";
  pugImg.src ="https://posterapplab.com/api/images/photos/ZaJprCvDjVA.png";

  //console.log(size.zoom);
  pugImg.onload = function (img) {
    let pug = new fabric.Image(pugImg,{
      crossOrigin: "anonymous",scaleX:0.3,scaleY:0.3,top: 20,left: 10,clipPath: Rect,clipTo: function (ctx) {
        clipMyObject(this,ctx);
      },});
    pug.crossOrigin = "anonymous";
    pug.backgroundVpt = false;
    pug.setControlsVisibility({
      mt: false,mb: false,});
    canvas.add(pug);
    canvas.renderAll();
  };

}

 function clipMyObject(thisObj,ctx) {
  if (thisObj.clipPath) {
    ctx.save();
    if (thisObj.clipPath.fixed) {
      var retina = thisObj.canvas.getRetinaScaling();
      ctx.setTransform(retina,retina,0);
      // to handle zoom
      ctx.transform.apply(ctx,thisObj.canvas.viewportTransform);
      thisObj.clipPath.transform(ctx);
    }

    thisObj.clipPath._render(ctx);
    ctx.restore();
    ctx.clip();
    var x = -thisObj.width / 2,y = -thisObj.height / 2,elementToDraw;

    if (
      thisObj.isMoving === false &&
      thisObj.resizefilter &&
      thisObj._needsResize()
    ) {
      thisObj._lastScaleX = thisObj.scaleX;
      thisObj._lastScaleY = thisObj.scaleY;
      thisObj.applyResizefilters();
    }
    elementToDraw = thisObj._element;
    elementToDraw &&
      ctx.drawImage(
        elementToDraw,thisObj.width,thisObj.height,x,y,thisObj.height
      );
    thisObj._stroke(ctx);
    thisObj._renderstroke(ctx);
  }
}


 rectMask(canvas);
 
 canvas.on("object:moving",(e) => {

      if (
        e.target &&
        e.target.type === "image" &&
        e.target.maskname
      ) {
        //obj.canvas.lastScaleY = obj.scaleY;
        //obj.canvas.lastScaleX = obj.scaleX;
        let bound = Rect.getBoundingRect();
        let selectedBound = e.target.getBoundingRect();
       
        //selectedobject.set("left",0);
        //console.log(bound.width);
        // console.log(bound.height);

        if (e.target.left > Rect.left) {
          
          e.target.set("left",Rect.left);
        }
        if (e.target.top > Rect.top) {
         e.target.set("top",Rect.top);
        }
       
        var right = Rect.left + Rect.getBoundingRect().width / 2;
        var bottom = Rect.top + Rect.getBoundingRect().height / 2;

        if (right > e.target.left + e.target.width / 2) {
          //Solution one
          e.target.set("left",Rect.left - Rect.width);
        }

        if (bottom > e.target.top + e.target.height / 2) {
          e.target.set("top",Rect.top - Rect.height / 2);
        }
        // console.log(selectedobject);

        /*if (selectedBound.left + selectedBound.width < bin.width) {
          console.log("hjfhsafdhagsdf");
          selectedobject.set("left",bin.left - bin.width / 2);
        }*/
      }
    });

我是Fabric的新手,我为图像创建了一个矩形形状和clipTo函数,现在我想将图像限制在形状区域中。顶部和左侧工作正常,但右侧和底部不平滑。请帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。