2017-09-08 1 views
0

Fabric JSで画像のフレームを構築する必要があります。このフレームは、画像の任意のサイズに合わせて動的に構築する必要があります。 は、私は2枚の画像を使用してこれを行うには:ぼかしを入れずに閉じたオブジェクトが、FabricJSで互いにスペースを持つ理由

用の画像私はそれをしないアルゴリズムを開発したと、それは動作します - 側

  • http://i.imgur.com/w41HYN3.png用画像!それは素晴らしいことです。 しかし、私はフレームの部分の配置に問題があります。 私の例で分かるように、ピースの間には奇妙なスペースがあり、Y軸によって同じレベルに配置されていません。私はこれらの部分が同じ高さを持ち、左と上の正しい値を持っているので非常に驚いています。 この問題の原因は何ですか?事前に おかげ

    JSフィドルhttps://jsfiddle.net/Eugene_Ilyin/gzjxhLtm/9/

    var sideObj = new fabric.Rect(), 
     
        frameSideTopImage = new fabric.Image(new Image(), {type: 'image'}),    
     
        frameCornerTLImage = new fabric.Image(new Image(), {type: 'image'}), 
     
        imageSize = 172,// Size of the image (width = height). 
     
        leftOffset = 100, 
     
        topOffset = 100; 
     
        
     
    // Load image for corner. 
     
    fabric.util.loadImage('http://i.imgur.com/w41HYN3.png', function (img) { 
     
        // Set image and options for top left corner. 
     
        frameCornerTLImage.setElement(img); 
     
        frameCornerTLImage.setOptions({ \t 
     
        \t strokeWidth: 0, 
     
        left: leftOffset, 
     
        top: topOffset 
     
        }); 
     
        
     
        // Load image for side. 
     
        fabric.util.loadImage('http://i.imgur.com/3VqKv1O.png', function (img) { 
     
        \t frameSideTopImage.setElement(img); 
     
        
     
        // Create canvas for pattern. 
     
        var canvasForFill = new fabric.StaticCanvas(fabric.util.createCanvasElement(), {enableRetinaScaling: false}); 
     
        canvasForFill.add(frameSideTopImage); 
     
    
     
    \t \t // Configure top side for the frame. 
     
        sideObj.setOptions({ 
     
        \t strokeWidth: 0, 
     
         objectCaching: false, 
     
         originX: 'left', 
     
         originY: 'top', 
     
         left: imageSize + 100, 
     
         top: 100, 
     
         width: 800, 
     
         height: imageSize, 
     
         fill: new fabric.Pattern({ 
     
         source: function() { 
     
          canvasForFill.setDimensions({ 
     
          width: imageSize, 
     
          height: imageSize 
     
          }); 
     
          return canvasForFill.getElement(); 
     
         }, 
     
         repeat: 'repeat-x' 
     
         }) 
     
        }); 
     
        
     
        var canvas = new fabric.Canvas('c'); 
     
        var frame = new fabric.Group([sideObj, frameCornerTLImage], { 
     
         strokeWidth: 0, 
     
         width: 800 * 3, 
     
         height: imageSize * 3, 
     
         scaleX: 1/3, 
     
         scaleY: 1/3,   
     
         } 
     
        ); 
     
        canvas.add(frame); 
     
        canvas.renderAll(); 
     
        }); 
     
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.7/fabric.js"></script> 
     
    <body> 
     
        <canvas id="c" width="1000" height="1000"></canvas> 
     
    </body>

  • 答えて

    1

    var sideObj = new fabric.Rect(), 
     
        frameSideTopImage = new fabric.Image(new Image(), {type: 'image'}),    
     
        frameCornerTLImage = new fabric.Image(new Image(), {type: 'image'}), 
     
        imageSize = 172,// Size of the image (width = height). 
     
        leftOffset = 100, 
     
        topOffset = 100; 
     
        
     
    // Load image for corner. 
     
    fabric.util.loadImage('http://i.imgur.com/w41HYN3.png', function (img) { 
     
        // Set image and options for top left corner. 
     
        frameCornerTLImage.setElement(img); 
     
        frameCornerTLImage.setOptions({ \t 
     
        left: leftOffset, 
     
        top: topOffset 
     
        }); 
     
        
     
        // Load image for side. 
     
        fabric.util.loadImage('http://i.imgur.com/3VqKv1O.png', function (img) { 
     
        \t frameSideTopImage.setElement(img); 
     
        
     
        // Create canvas for pattern. 
     
        var canvasForFill = new fabric.StaticCanvas(fabric.util.createCanvasElement(), {enableRetinaScaling: false}); 
     
        canvasForFill.add(frameSideTopImage); 
     
    
     
    \t // Configure top side for the frame. 
     
        sideObj.setOptions({ 
     
         objectCaching: false, 
     
         originX: 'left', 
     
         originY: 'top', 
     
         left: imageSize + 100, 
     
         top: 100, 
     
         width: 800, 
     
         strokeWidth:0, 
     
         height: imageSize, 
     
         fill: new fabric.Pattern({ 
     
         source: function() { 
     
          canvasForFill.setDimensions({ 
     
          width: imageSize, 
     
          height: imageSize 
     
          }); 
     
          return canvasForFill.getElement(); 
     
         }, 
     
         repeat: 'repeat-x' 
     
         }) 
     
        }); 
     
        
     
        var canvas = new fabric.Canvas('c'); 
     
        canvas.add(sideObj); 
     
        canvas.add(frameCornerTLImage); 
     
        canvas.renderAll(); 
     
        }); 
     
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.7/fabric.js"></script> 
     
    <body> 
     
        <canvas id="c" width="1000" height="1000"></canvas> 
     
    </body>

    strokeWidth:0を設定し、strokeWidthはデフォルト1であるので、幅1の境界線を作成し、 。

    +0

    ありがとうございます。私はすでにそれを試みましたが、私の場合は助けになりません。 申し訳ありませんが、すべての条件を再現しているわけではありません。さて、私は最初のメッセージを更新しました。私はスケーリングを使用し、問題は再現されます。それを確認できますか?多分あなたは解決策を知っていますか?前もって感謝します。 – Eugene

    関連する問題