2017-07-10 27 views
0

角度キャンバスペインタを使用していましたが、キャンバス画像では画像の高さを100%として、画像の高さを100%に設定します。キャンバス画像の幅と高さを設定するには

options.width = options.width || '480'; 
    options.height = options.height || '350'; 

誰でもこの問題を解決するのに役立ちますか?

以下は、私が疲れautoを使用するのJSフィドル[https://jsfiddle.net/Raviteja123/vjy2w0e3/1/]

+0

なぜこのようなものを使用できませんか? ng-style = "{'width':" auto "'}"またはクラスを指定してCSSにスタイルを書き出します。 –

+0

私はキャンバスイメージの幅と高さを設定する必要があります.htmlで設定しようとしましたが、ディレクティブファイルに値を渡しましたが、その値は機能しませんでした。 – Satya

+0

いくつかのコードを共有できますか?与えられたコードでは、その困難です。 –

答えて

0

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
<body> 
 

 

 
<div ng-app="myApp" ng-controller="myctrl as canvasctrl"> 
 
<input type="file" name="img[]" class="file" onchange="angular.element(this).scope().ocular_file(this.files)" ngf-select ng-model="file" style="position:relative;width:auto;height:auto;"> 
 
<div pw-canvas   versionright="canvasctrl.versionright" options="{undo: true,color: selectedColor, lineWidth: selectedLineWidth,imageSrc:thumbnail.dataUrl}"ng-show="showCanvasdiv" > 
 
<div class="pwCanvasPaint" style=""></div> 
 
    </div> 
 
    <div pw-color-selector="['#000', '#9CB199', '#CF3759', '#485247', '#E77547', '#D38E47', '#0A6A74', '#153974']" color="selectedColor"> 
 
     </div> 
 
     
 
         
 
<div class="undo"> 
 
    <button ng-click="canvasctrl.undo()" 
 
    ng-disabled="canvasctrl.versionright < 1">Undo ({{canvasctrl.versionright}})</button></div> 
 
    
 
             
 
</div> 
 
</body> 
 
<style> 
 
.alpha{height:100%;width:100%;border:1px solid red;} 
 
canvas{height:100%;width:100%;border:1px solid green;} 
 

 
</style> 
 
<script> 
 
var app = angular.module("myApp", []); 
 
app.directive('pwCanvas', function() { 
 
    return { 
 
     restrict: 'AE', 
 
     scope: { 
 
     options: '=', 
 
     versionright: '=' 
 
     }, 
 
     //templateUrl: '../templates/canvas.html', 
 
     link: function postLink(scope, elm) { 
 

 
     var isTouch = !!('ontouchstart' in window); 
 
     elm.addClass('alpha'); 
 
     var PAINT_START = isTouch ? 'touchstart' : 'mousedown'; 
 
     var PAINT_MOVE = isTouch ? 'touchmove' : 'mousemove'; 
 
     var PAINT_END = isTouch ? 'touchend' : 'mouseup'; 
 

 
     //set default options 
 
     var options = scope.options; 
 
     options.canvasId = options.customCanvasId || 'pwCanvasMain'; 
 
     options.tmpCanvasId = options.customCanvasId ? (options.canvasId + 'Tmp') : 'pwCanvasTmp'; 
 
     options.backgroundColor = options.backgroundColor || '#fff'; 
 
     options.color = options.color || '#000'; 
 
     options.undoEnabled = options.undoEnabled || false; 
 
     options.opacity = options.opacity || 0.9; 
 
     options.lineWidth = options.lineWidth || 1; 
 
     options.undo = options.undo || false; 
 
     //alert(options.imageSrc); 
 
     options.imageSrc = options.imageSrc || 'img/optha/image-workgd.png'; 
 
     
 
     // background image 
 
     if (options.imageSrc) { 
 

 
      var image = new Image(); 
 
      image.onload = function() { 
 
      ctx.drawImage(this, 0, 0); 
 
      }; 
 
      image.src = options.imageSrc; 
 
      scope.$watch(function(){ 
 
      \t return options.imageSrc; 
 
      },function(newVal){ 
 
      \t scope.options.imageSrc = newVal; 
 
      }); 
 
      scope.$watch('options.imageSrc', function(newVal) { 
 
      // \t alert(newVal); 
 
      \t \t scope.options.imageSrc = newVal; 
 
      \t \t image.src = newVal; 
 
      }); 
 

 
     } 
 

 
     //undo 
 
     if (options.undo) { 
 
      var undoCache = []; 
 
      scope.$watch(function() { 
 
      return undoCache.length; 
 
      }, function(newVal) { 
 
      scope.versionright = newVal; 
 
      }); 
 

 
      scope.$watch('versionright', function(newVal) { 
 
      if (newVal < 0) { 
 
       scope.versionright = 0; 
 
       return; 
 
      } 
 
      if (newVal >= undoCache.length) { 
 
       scope.versionright = undoCache.length; 
 
       return; 
 
      } 
 
      undo(newVal); 
 
      }); 
 
     } 
 

 
     //create canvas and context 
 
     var canvas = document.createElement('canvas'); 
 
     canvas.id = options.canvasId; 
 
     var canvasTmp = document.createElement('canvas'); 
 
     canvasTmp.id = options.tmpCanvasId; 
 
     angular.element(canvasTmp).css({ 
 
      position: 'absolute', 
 
      top: 0, 
 
      left: 0 
 
     }); 
 
     elm.find('div').append(canvas); 
 
     elm.find('div').append(canvasTmp); 
 
     var ctx = canvas.getContext('2d'); 
 
     var ctxTmp = canvasTmp.getContext('2d'); 
 

 
     //inti variables 
 
     var point = { 
 
      x: 0, 
 
      y: 0 
 
     }; 
 
     var ppts = []; 
 

 
     //set canvas size 
 
     canvas.width = canvasTmp.width; 
 
     canvas.height = canvasTmp.height; 
 

 
     //set context style 
 
     ctx.fillStyle = options.backgroundColor; 
 
     ctx.fillRect(0, 0, canvas.width, canvas.height); 
 
     ctxTmp.globalAlpha = options.opacity; 
 
     ctxTmp.lineJoin = ctxTmp.lineCap = 'round'; 
 
     ctxTmp.lineWidth = 10; 
 
     ctxTmp.strokeStyle = options.color; 
 

 

 
     //Watch options 
 
     
 
     scope.$watch('options.lineWidth', function(newValue) { 
 
      if (typeof newValue === 'string') { 
 
      newValue = parseInt(newValue, 10); 
 
      } 
 
      if (newValue && typeof newValue === 'number') { 
 
      ctxTmp.lineWidth = options.lineWidth = newValue; 
 
      } 
 
     }); 
 

 
     scope.$watch('options.color', function(newValue) { 
 
      if (newValue) { 
 
      //ctx.fillStyle = newValue; 
 
      ctxTmp.strokeStyle = ctxTmp.fillStyle = newValue; 
 
      } 
 
     }); 
 

 
     scope.$watch('options.opacity', function(newValue) { 
 
      if (newValue) { 
 
      ctxTmp.globalAlpha = newValue; 
 
      } 
 
     }); 
 

 
     var getOffset = function(elem) { 
 
      var bbox = elem.getBoundingClientRect(); 
 
      return { 
 
      left: bbox.left, 
 
      top: bbox.top 
 
      }; 
 
     }; 
 

 
     var setPointFromEvent = function(point, e) { 
 
      if (isTouch) { 
 
      point.x = e.changedTouches[0].pageX - getOffset(e.target).left; 
 
      point.y = e.changedTouches[0].pageY - getOffset(e.target).top; 
 
      } else { 
 
      point.x = e.offsetX !== undefined ? e.offsetX : e.layerX; 
 
      point.y = e.offsetY !== undefined ? e.offsetY : e.layerY; 
 
      } 
 
     }; 
 

 

 
     var paint = function(e) { 
 
      if (e) { 
 
      e.preventDefault(); 
 
      setPointFromEvent(point, e); 
 
      } 
 

 
      // Saving all the points in an array 
 
      ppts.push({ 
 
      x: point.x, 
 
      y: point.y 
 
      }); 
 

 
      if (ppts.length === 3) { 
 
      var b = ppts[0]; 
 
      ctxTmp.beginPath(); 
 
      ctxTmp.arc(b.x, b.y, ctxTmp.lineWidth/2, 0, Math.PI * 2, !0); 
 
      ctxTmp.fill(); 
 
      ctxTmp.closePath(); 
 
      return; 
 
      } 
 

 
      // Tmp canvas is always cleared up before drawing. 
 
      ctxTmp.clearRect(0, 0, canvasTmp.width, canvasTmp.height); 
 

 
      ctxTmp.beginPath(); 
 
      ctxTmp.moveTo(ppts[0].x, ppts[0].y); 
 

 
      for (var i = 1; i < ppts.length - 2; i++) { 
 
      var c = (ppts[i].x + ppts[i + 1].x)/2; 
 
      var d = (ppts[i].y + ppts[i + 1].y)/2; 
 
      ctxTmp.quadraticCurveTo(ppts[i].x, ppts[i].y, c, d); 
 
      } 
 

 
      // For the last 2 points 
 
      ctxTmp.quadraticCurveTo(
 
      ppts[i].x, 
 
      ppts[i].y, 
 
      ppts[i + 1].x, 
 
      ppts[i + 1].y 
 
     ); 
 
      ctxTmp.stroke(); 
 
     }; 
 

 
     var copyTmpImage = function() { 
 
      if (options.undo) { 
 
      scope.$apply(function() { 
 
       undoCache.push(ctx.getImageData(0, 0, canvasTmp.width, canvasTmp.height)); 
 
       if (angular.isNumber(options.undo) && options.undo > 0) { 
 
       undoCache = undoCache.slice(-1 * options.undo); 
 
       } 
 
      }); 
 
      } 
 
      canvasTmp.removeEventListener(PAINT_MOVE, paint, false); 
 
      ctx.drawImage(canvasTmp, 0, 0); 
 
      ctxTmp.clearRect(0, 0, canvasTmp.width, canvasTmp.height); 
 
      ppts = []; 
 
     }; 
 

 
     var startTmpImage = function(e) { 
 
      e.preventDefault(); 
 
      canvasTmp.addEventListener(PAINT_MOVE, paint, false); 
 

 
      setPointFromEvent(point, e); 
 
      ppts.push({ 
 
      x: point.x, 
 
      y: point.y 
 
      }); 
 
      ppts.push({ 
 
      x: point.x, 
 
      y: point.y 
 
      }); 
 

 
      paint(); 
 
     }; 
 

 
     var initListeners = function() { 
 
      canvasTmp.addEventListener(PAINT_START, startTmpImage, false); 
 
      canvasTmp.addEventListener(PAINT_END, copyTmpImage, false); 
 

 
      if (!isTouch) { 
 
      var MOUSE_DOWN; 
 

 
      document.body.addEventListener('mousedown', mousedown); 
 
      document.body.addEventListener('mouseup', mouseup); 
 

 
      scope.$on('$destroy', removeEventListeners); 
 

 
      canvasTmp.addEventListener('mouseenter', mouseenter); 
 
      canvasTmp.addEventListener('mouseleave', mouseleave); 
 
      } 
 

 
      function mousedown() { 
 
      MOUSE_DOWN = true; 
 
      } 
 

 
      function mouseup() { 
 
      MOUSE_DOWN = false; 
 
      } 
 

 
      function removeEventListeners() { 
 
      document.body.removeEventListener('mousedown', mousedown); 
 
      document.body.removeEventListener('mouseup', mouseup); 
 
      } 
 

 
      function mouseenter(e) { 
 
      // If the mouse is down when it enters the canvas, start a path 
 
      if (MOUSE_DOWN) { 
 
       startTmpImage(e); 
 
      } 
 
      } 
 

 
      function mouseleave(e) { 
 
      // If the mouse is down when it leaves the canvas, end the path 
 
      if (MOUSE_DOWN) { 
 
       copyTmpImage(e); 
 
      } 
 
      } 
 
     }; 
 

 
     var undo = function(versionright) { 
 
     \t console.log(undoCache.length); 
 
      if (undoCache.length > 0) { 
 
      ctx.putImageData(undoCache[versionright], 0, 0); 
 
      undoCache = undoCache.slice(0, versionright); 
 
      } 
 
     }; 
 

 
     initListeners(); 
 
     } 
 
    }; 
 
    }); 
 

 
app.controller("myctrl", function($scope,$timeout) { 
 
$scope.thumbnail = []; 
 
    $scope.showCanvasdiv = false; 
 
    // Read the image using the filereader 
 
    $scope.fileReaderSupported = window.FileReader != null; 
 
    $scope.ocular_file = function(files){ 
 
    if (files != null) { 
 
     var file = files[0]; 
 
     if ($scope.fileReaderSupported && file.type.indexOf('image') > -1) { 
 
      $timeout(function() { 
 
      var fileReader = new FileReader(); 
 
      fileReader.readAsDataURL(file); // convert the image to data url. 
 
      fileReader.onload = function(e) { 
 
       $scope.showCanvasdiv = true; 
 
       
 
       $timeout(function() { 
 
       
 
       $scope.thumbnail.dataUrl = e.target.result; // Retrieve the image. 
 
       //console.log($scope.thumbnail.dataUrl); 
 
       }); 
 
      } 
 
      }); 
 
     } 
 
     } 
 
    }; 
 
    this.undo = function(){ 
 
     
 
      this.versionright--; 
 
    }; 
 
}); 
 
</script>

であり、ディレクティブを使用して、正常に動作します。お役に立てれば。

+0

@Nandagopalあなたは角度キャンバスペインタのプラグインを使用しましたか? – Satya

+0

いいえ、コードを共有できますか? Wilはそれに取り組もうとしています。 –

+0

確かに私はそれのための手伝いを手配します。 – Satya

関連する問題