canvas画波形图

最近公司要在浏览器上加个波形图,本人搞C++的,不会html5,在网上搜了半天没找到一个例子,只好自己研究了。。郁闷啊

画这个图主要用到html5的canvas,不多说,直接搞代码上来,注释已写好,自己看

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <style>
	canvas{
		background:#eee;
	}
  </style>
  <script>

	var x = 0; // canvas画布原点x
	var y = 0; // canvas画布原点y
	var x_base = x; // 我们要画的波形图的最后一个点的x坐标
	var y_base = 250; // 我们要画的波形图的最后一个点的y坐标
	var arrPoint = []; // 用于保存已经波形图的轨迹点
	var index = 0; // 这个我是用来打日志用的..下面为了看清除了多少次canvas画布
	var step = 10; // x轴每次走的步长
	var width=500; // 这个是画布宽度
	var height=500; // 这个是画图高度
	(function (){
		// 首先让我们的函数周期调用
		var itv = setInterval(function(){
			// 获取canvas对象和context,并进行一系列初始化
			var canvas = document.getElementById("canvas");
			var context = canvas.getContext("2d");
			context.strokeStyle = "rgb(255,0,0)";
			context.fileStyle = "rgb(255,0,0)";

			// 画图之前首先清理一下我们的画布,四个参数.
			// 1.坐标原点x
			// 2.坐标原点y
			// 3.要清理的宽度(这里宽度用的x_base是因为canvas画布的原点不断向左移动,变相的等于画布不断变宽
			//   之所以减一个step是需要看下文,因为在下文中,x_base每一次都会增加一个step,而我们在清理画布的时候,
			//   我们的画布原点还没有被移动,相当于我们在清除画布时,我们的画布宽度还没有增加,所以要减一个step,当然不减也可以,没事儿)
			// 4.画布高度
			context.clearRect(0,0,x_base-step,height);
			if(x_base > width){
				console.log("clear" + index);
				index++;
				// 画布原点x轴向左移动一个step的位置
				context.translate(step*-1,0);
			}
			
			// 向数组中添加数据,将我们每一次目标到达的终点坐标添加到数组中.这里我设置的条件是,保证数组大小不会超过我的画布宽度除以step个
			// 目的是针对画布定的,就是每一次我只画画布这么大小的图
			var obj = {};
			obj.x = x_base;
			obj.y = y_base;
			if(arrPoint.length>(width/step)){
				arrPoint.splice(0,1);
				console.log(arrPoint);
			}
			arrPoint.push(obj);
			
			// 开始画了,在画之前先将所有的图形都画出来
			context.beginPath();
			for(var i = 0; i < arrPoint.length; i++){
				context.lineTo(arrPoint[i].x,arrPoint[i].y);

			}
			// 再一次性将所有图形呈现在html上
			context.stroke();
			context.closePath();

			// OK,这时候已经花完了,现在要算一算我们的下一个目标点的坐标了,算完了以后,保存在一个全局变量中
			// 等待下次再执行画图函数时,将变量添加到数组中,让canvas画图使用
			x_base += step;
			y_base = 250 + Math.random()*20;
		},100)
	})()

  </script>
 </head>
 <body>
	<canvas id="canvas" width="500" height="500">
		你这不行啊..不支持canvas
	</canvas>
 </body>
</html>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是利用electron框架结合canvas波形图的全部过程以及代码: 1. 创建一个新的electron项目,安装必要的依赖项(electron、canvas)。 2. 在项目中创建一个HTML文件,添加一个canvas元素用于绘制波形图。例如: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Waveform</title> </head> <body> <canvas id="waveform"></canvas> </body> </html> ``` 3. 在项目中创建一个JavaScript文件,用于绘制波形图。首先,获取canvas元素和其上下文: ``` const canvas = document.getElementById('waveform'); const ctx = canvas.getContext('2d'); ``` 4. 创建一个AudioContext对象,用于加载音频并解码: ``` const audioCtx = new AudioContext(); ``` 5. 加载音频文件并解码: ``` const audioElement = document.getElementById('audio'); const audioSource = audioCtx.createMediaElementSource(audioElement); const analyser = audioCtx.createAnalyser(); audioSource.connect(analyser); analyser.connect(audioCtx.destination); ``` 6. 设置analyser的参数,包括FFT大小、频域数据长度等: ``` analyser.fftSize = 2048; const bufferLength = analyser.frequencyBinCount; const dataArray = new Uint8Array(bufferLength); ``` 7. 在requestAnimationFrame函数中周期性地更新波形图: ``` function draw() { requestAnimationFrame(draw); analyser.getByteTimeDomainData(dataArray); ctx.fillStyle = 'rgb(200, 200, 200)'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.lineWidth = 2; ctx.strokeStyle = 'rgb(0, 0, 0)'; ctx.beginPath(); const sliceWidth = canvas.width * 1.0 / bufferLength; let x = 0; for(let i = 0; i < bufferLength; i++) { const v = dataArray[i] / 128.0; const y = v * canvas.height / 2; if(i === 0) { ctx.moveTo(x, y); } else { ctx.lineTo(x, y); } x += sliceWidth; } ctx.lineTo(canvas.width, canvas.height / 2); ctx.stroke(); }; draw(); ``` 完整的JavaScript代码如下: ``` const canvas = document.getElementById('waveform'); const ctx = canvas.getContext('2d'); const audioCtx = new AudioContext(); const audioElement = document.getElementById('audio'); const audioSource = audioCtx.createMediaElementSource(audioElement); const analyser = audioCtx.createAnalyser(); audioSource.connect(analyser); analyser.connect(audioCtx.destination); analyser.fftSize = 2048; const bufferLength = analyser.frequencyBinCount; const dataArray = new Uint8Array(bufferLength); function draw() { requestAnimationFrame(draw); analyser.getByteTimeDomainData(dataArray); ctx.fillStyle = 'rgb(200, 200, 200)'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.lineWidth = 2; ctx.strokeStyle = 'rgb(0, 0, 0)'; ctx.beginPath(); const sliceWidth = canvas.width * 1.0 / bufferLength; let x = 0; for(let i = 0; i < bufferLength; i++) { const v = dataArray[i] / 128.0; const y = v * canvas.height / 2; if(i === 0) { ctx.moveTo(x, y); } else { ctx.lineTo(x, y); } x += sliceWidth; } ctx.lineTo(canvas.width, canvas.height / 2); ctx.stroke(); }; draw(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值