2017-10-31 22 views
0

この例では、画像のサイズを変更しないで、画像をサイズ変更、ドラッグ、フィルタリングする際にKonvajs 2dキャンバスライブラリを使用しています。誰も私を助けることができますか?konvajs - 画像のサイズ変更、ドラッグ&フィルターは一度に動作しません

:私はGoogleの画像のURLを使用している、それはクロスorginドメイン・エラーが表示されます。だからあなたのローカルイメージを試してみて、Firefoxのブラウザで試してみてください。

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <script src="https://cdn.rawgit.com/konvajs/konva/1.7.4/konva.min.js"></script> 
 
    <meta charset="utf-8"> 
 
    <title>Konva Image Resize Demo</title> 
 
    <style> 
 
    body { 
 
     margin: 0; 
 
     padding: 0; 
 
     overflow: hidden; 
 
     background-color: #F0F0F0; 
 
    } 
 
    </style> 
 
</head> 
 
<body> 
 
    <div id="container"></div> 
 
    <script> 
 
    var width = window.innerWidth; 
 
    var height = window.innerHeight; 
 
    function update(activeAnchor) { 
 
     var group = activeAnchor.getParent(); 
 
     var topLeft = group.get('.topLeft')[0]; 
 
     var topRight = group.get('.topRight')[0]; 
 
     var bottomRight = group.get('.bottomRight')[0]; 
 
     var bottomLeft = group.get('.bottomLeft')[0]; 
 
     var image = group.get('Image')[0]; 
 
     var anchorX = activeAnchor.getX(); 
 
     var anchorY = activeAnchor.getY(); 
 
     // update anchor positions 
 
     switch (activeAnchor.getName()) { 
 
      case 'topLeft': 
 
       topRight.setY(anchorY); 
 
       bottomLeft.setX(anchorX); 
 
       break; 
 
      case 'topRight': 
 
       topLeft.setY(anchorY); 
 
       bottomRight.setX(anchorX); 
 
       break; 
 
      case 'bottomRight': 
 
       bottomLeft.setY(anchorY); 
 
       topRight.setX(anchorX); 
 
       break; 
 
      case 'bottomLeft': 
 
       bottomRight.setY(anchorY); 
 
       topLeft.setX(anchorX); 
 
       break; 
 
     } 
 
     image.position(topLeft.position()); 
 
     var width = topRight.getX() - topLeft.getX(); 
 
     var height = bottomLeft.getY() - topLeft.getY(); 
 
     if(width && height) { 
 
      image.width(width); 
 
      image.height(height); 
 
     } 
 
    } 
 
    function addAnchor(group, x, y, name) { 
 
     var stage = group.getStage(); 
 
     var layer = group.getLayer(); 
 
     var anchor = new Konva.Circle({ 
 
      x: x, 
 
      y: y, 
 
      stroke: '#666', 
 
      fill: '#ddd', 
 
      strokeWidth: 2, 
 
      radius: 8, 
 
      name: name, 
 
      draggable: true, 
 
      dragOnTop: false 
 
     }); 
 
     anchor.on('dragmove', function() { 
 
      update(this); 
 
      layer.draw(); 
 
     }); 
 
     anchor.on('mousedown touchstart', function() { 
 
      group.setDraggable(false); 
 
      this.moveToTop(); 
 
     }); 
 
     anchor.on('dragend', function() { 
 
      group.setDraggable(true); 
 
      layer.draw(); 
 
     }); 
 
     // add hover styling 
 
     anchor.on('mouseover', function() { 
 
      var layer = this.getLayer(); 
 
      document.body.style.cursor = 'pointer'; 
 
      this.setStrokeWidth(4); 
 
      layer.draw(); 
 
     }); 
 
     anchor.on('mouseout', function() { 
 
      var layer = this.getLayer(); 
 
      document.body.style.cursor = 'default'; 
 
      this.setStrokeWidth(2); 
 
      layer.draw(); 
 
     }); 
 
     group.add(anchor); 
 
    } 
 
    var stage = new Konva.Stage({ 
 
     container: 'container', 
 
     width: width, 
 
     height: height 
 
    }); 
 
    var layer = new Konva.Layer(); 
 
    stage.add(layer); 
 
    // darth vader 
 
    var darthVaderImg = new Konva.Image({ 
 
     width: 200, 
 
     height: 137 
 
    }); 
 

 
    var darthVaderGroup = new Konva.Group({ 
 
     x: 180, 
 
     y: 50, 
 
     draggable: true 
 
    }); 
 
    layer.add(darthVaderGroup); 
 
    darthVaderGroup.add(darthVaderImg); 
 
    addAnchor(darthVaderGroup, 0, 0, 'topLeft'); 
 
    addAnchor(darthVaderGroup, 200, 0, 'topRight'); 
 
    addAnchor(darthVaderGroup, 200, 138, 'bottomRight'); 
 
    addAnchor(darthVaderGroup, 0, 138, 'bottomLeft'); 
 
    var yodaGroup = new Konva.Group({ 
 
     x: 20, 
 
     y: 110, 
 
     draggable: true 
 
    }); 
 

 

 
    var imageObj1 = new Image(); 
 
    imageObj1.onload = function() { 
 
     darthVaderImg.image(imageObj1); 
 
     darthVaderImg.cache(); 
 
     darthVaderImg.filters([Konva.Filters.RGBA]); 
 
     darthVaderImg['red'](250); 
 
     darthVaderImg['green'](150); 
 
     darthVaderImg['blue'](150); 
 
     darthVaderImg['alpha'](1); 
 
     layer.batchDraw();  
 
     layer.draw(); 
 
    }; 
 
    imageObj1.src = 'http://www.gstatic.com/webp/gallery/1.jpg'; 
 
    
 
    </script> 
 
</body> 
 
</html>

答えて

0

私は関数にあなたのフィルタを作り、画像のロードでそれを呼ばれ、その後、ドラッグ移動やドラッグエンドに。これがパフォーマンスのために適切な方法であることを完全には確信していません - フィルタが適用された画像をキャッシュする方法があり、フィルタを再適用するオーバーヘッドが無効になる可能性があります。

SOスニペットでは、フィルタのクロスドメイン警告が表示されますが、ドラッグサイジングは現在機能しています。ローカルイメージを使用して実行すると、サイズ調整プロセス中にフィルタが有効になります。

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <script src="https://cdn.rawgit.com/konvajs/konva/1.7.4/konva.min.js"></script> 
 
    <meta charset="utf-8"> 
 
</head> 
 
<body> 
 
    <div id="container"></div> 
 
    <script> 
 
    var width = window.innerWidth; 
 
    var height = window.innerHeight; 
 
    function update(activeAnchor) { 
 
\t \t 
 
     var group = activeAnchor.getParent(); 
 
     var topLeft = group.get('.topLeft')[0]; 
 
     var topRight = group.get('.topRight')[0]; 
 
     var bottomRight = group.get('.bottomRight')[0]; 
 
     var bottomLeft = group.get('.bottomLeft')[0]; 
 
     var image = group.get('Image')[0]; 
 
     var image = darthVaderImg; //group.get('Image')[0]; 
 
\t \t 
 
     var anchorX = activeAnchor.getX(); 
 
     var anchorY = activeAnchor.getY(); 
 
     // update anchor positions 
 

 
     switch (activeAnchor.getName()) { 
 
      case 'topLeft': 
 
       topRight.setY(anchorY); 
 
       bottomLeft.setX(anchorX); 
 
       break; 
 
      case 'topRight': 
 
       topLeft.setY(anchorY); 
 
       bottomRight.setX(anchorX); 
 
       break; 
 
      case 'bottomRight': 
 
       bottomLeft.setY(anchorY); 
 
       topRight.setX(anchorX); 
 
       break; 
 
      case 'bottomLeft': 
 
       bottomRight.setY(anchorY); 
 
       topLeft.setX(anchorX); 
 
       break; 
 
     } 
 
     image.position(topLeft.position()); 
 
     var width = topRight.getX() - topLeft.getX(); 
 
     var height = bottomLeft.getY() - topLeft.getY(); 
 
     if(width && height) { 
 
      image.width(width); 
 
      image.height(height); 
 
     } 
 
    } 
 
    function addAnchor(group, x, y, name) { 
 
     var stage = group.getStage(); 
 
     var layer = group.getLayer(); 
 
     var anchor = new Konva.Circle({ 
 
      x: x, 
 
      y: y, 
 
      stroke: '#666', 
 
      fill: '#ddd', 
 
      strokeWidth: 2, 
 
      radius: 8, 
 
      name: name, 
 
      draggable: true, 
 
      dragOnTop: false 
 
     }); 
 
     anchor.on('dragmove', function() { 
 
      update(this); 
 
\t \t \t applyFilter(); 
 
      layer.draw(); 
 
     }); 
 
     anchor.on('mousedown touchstart', function() { 
 
      group.setDraggable(false); 
 
      this.moveToTop(); 
 
     }); 
 
     anchor.on('dragend', function() { 
 
      group.setDraggable(true); 
 
\t \t \t applyFilter(); 
 
     }); 
 
     // add hover styling 
 
     anchor.on('mouseover', function() { 
 
      var layer = this.getLayer(); 
 
      document.body.style.cursor = 'pointer'; 
 
      this.setStrokeWidth(4); 
 
      layer.draw(); 
 
     }); 
 
     anchor.on('mouseout', function() { 
 
      var layer = this.getLayer(); 
 
      document.body.style.cursor = 'default'; 
 
      this.setStrokeWidth(2); 
 
      layer.draw(); 
 
     }); 
 
     group.add(anchor); 
 
    } 
 
\t function applyFilter(){ 
 
\t  darthVaderImg.cache(); 
 
     darthVaderImg.filters([Konva.Filters.RGBA]); 
 
     darthVaderImg['red'](250); 
 
     darthVaderImg['green'](150); 
 
     darthVaderImg['blue'](150); 
 
     darthVaderImg['alpha'](.1); 
 
     layer.batchDraw(); 
 
\t \t layer.draw(); \t \t 
 
\t } 
 
    var stage = new Konva.Stage({ 
 
     container: 'container', 
 
     width: width, 
 
     height: height 
 
    }); 
 
    var layer = new Konva.Layer(); 
 
    stage.add(layer); 
 
    // darth vader 
 
    var darthVaderImg = new Konva.Image({ 
 
     width: 200, 
 
     height: 137 
 
    }); 
 

 
    var darthVaderGroup = new Konva.Group({ 
 
     x: 180, 
 
     y: 50, 
 
     draggable: true 
 
    }); 
 
    layer.add(darthVaderGroup); 
 
    darthVaderGroup.add(darthVaderImg); 
 
    addAnchor(darthVaderGroup, 0, 0, 'topLeft'); 
 
    addAnchor(darthVaderGroup, 200, 0, 'topRight'); 
 
    addAnchor(darthVaderGroup, 200, 138, 'bottomRight'); 
 
    addAnchor(darthVaderGroup, 0, 138, 'bottomLeft'); 
 
    var yodaGroup = new Konva.Group({ 
 
     x: 20, 
 
     y: 110, 
 
     draggable: true 
 
    }); 
 

 
    var imageObj1 = new Image(); 
 
    imageObj1.onload = function() { 
 
     darthVaderImg.image(imageObj1); 
 
\t \t  applyFilter(); 
 
    }; 
 
    imageObj1.src = 'http://www.gstatic.com/webp/gallery/1.jpg'; 
 
    
 
    </script> 
 
</body> 
 
</html>

関連する問題