尝试在画布

时间:2017-09-05 08:19:37

标签: javascript html5 canvas html5-canvas

我正在制定PWA,用于进行调查,所以我正在做的是, 我正在从视频(在应用程序内)捕获快照并将其保存在画布中,这样可以正常工作。

现在我需要在上面添加日期,时间和地理坐标。

我的Javascript代码

var video = document.querySelector('video');
var takenPhotosDiv = document.getElementById( "taken-photos" );


var button = document.querySelector('button');
button.onclick = function() {
  drawCanvas();
};


var drawCanvas = function(){
  var canvas = window.canvas =  document.createElement('canvas');
  canvas.width = video.videoWidth;
  canvas.height = video.videoHeight;
  canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
   canvas.getContext('2d').fillText( "30-08-2017" + "   " + "15:25" + "  " + "(79.85858454, 17.56852655)", 50, 150 );
  takenPhotosDiv.appendChild( canvas );
}

上面的代码工作正常,它确实接近预期,这里是上面代码的示例输出 output

最终的文字格式应该看起来像this(文字栏应位于图片的底部,而不是位于中间,字体更大)

PS:我不仅需要以上述格式显示,甚至需要保存并稍后在Firebase上推送它。

编辑:

var addTextToCanvas = function( canvas ){
  canvas.lineWidth = 2;
  canvas.fillStyle = "blue";
  canvas.font = "bold 20px sans-serif";
  canvas.textBaseline = "bottom";
  canvas.fillText( "30-08-2017" + "   " + "15:25" + "  " + "(79.85858454, 17.56852655)", 0, 100 );
  return canvas;  
};

我尝试了这个,但字体和字体大小保持不变。

这个函数是从drawCanvas()调用的,就在它附加到div之前,因为它不起作用,我只是在画布上添加了一个名为fillText的文件

编辑2:

enter image description here

2 个答案:

答案 0 :(得分:1)

试试这个

var canvas = window.canvas =  document.createElement('canvas');
var ctx = canvas.getContext('2d'); 

var text = "30-08-2017\n15:25\n(79.85858454, 17.56852655)";
ctx.font = "30px Arial";
ctx.fillStyle = "red";
ctx.textAlign = "center";
ctx.fillText(text, canvas.width/2, canvas.height/2); 

答案 1 :(得分:1)

确保在上下文上设置方法和属性,而不是在canvas元素本身上设置。

我们还需要计算文本的实际垂直位置。由于它与底部对齐,我们可以使用画布的高度减去一些底部填充:

var y = canvas.height - 10;

所以,例如:

var addTextToCanvas = function( context ) { // pass in 2D context
  var y = context.canvas.height - 10;
  context.fillStyle = "blue";
  context.font = "bold 20px sans-serif";
  context.textBaseline = "bottom";
  context.fillText( "30-08-2017"+"   "+"15:25"+"  "+"(79.85858454, 17.56852655)", 10, y );
  return context;  
};

或者如果你想传递画布:

var addTextToCanvas = function( canvas ) {
  var context = canvas.getContext("2d");
  var y = canvas.height - 10;
  context.fillStyle = "blue";
  context.font = "bold 20px sans-serif";
  context.textBaseline = "bottom";
  context.fillText( "30-08-2017"+"   "+"15:25"+"  "+"(79.85858454, 17.56852655)", 10, y );
  return context;  
};

lineWidth在此处不执行任何操作,因此可以将其删除。

我建议您全局存储一次上下文。它与您每次获得的上下文相同,但每次使用时都会有更多的开销请求。

功能示例:

var ctx = c.getContext("2d");

var addTextToCanvas = function( context ) {
  context.fillStyle = "blue";
  context.font = "bold 20px sans-serif";
  context.textBaseline = "bottom";
  
  var y = context.canvas.height - 10;
  context.fillText( "30-08-2017"+"   "+"15:25"+"  "+"(79.85858454, 17.56852655)", 10, y );
  return context;  
};

addTextToCanvas(ctx);
#c {border: 1px solid #999}
<canvas id=c width=600 height=180></canvas>

最后,要提取为图像,需要在canvas元素上进行调用而不是上下文(可能会令人困惑):

var dataUrl = canvas.toDataURL();   // saves out PNG image

或JPEG:

var dataUrl = canvas.toDataURL("image/jpeg", 0.75);