基于VC++的WAV波形显示代码

//波形绘制函数
void DrawWave(FILE * WavFile,int SumPot)
{
     //获取客户窗口大小位置
     CWnd *LeftWnd = GetDlgItem(IDC_WAVEL);
     CRect leftrect;
     LeftWnd->GetClientRect(&leftrect);

     CWnd *RightWnd = GetDlgItem(IDC_WAVER);
     CRect rightrect;
     RightWnd->GetClientRect(&rightrect);

     int leftHeight = leftrect.Height(),leftWidth = leftrect.Width();
     int rightHeight = rightrect.Height(),rightWidth = rightrect.Width();

     //将客户窗口背景色设置为黑色
     CClientDC leftdc(LeftWnd);
     leftdc.FillSolidRect(&leftrect,RGB(0,0,0));
     CClientDC rightdc(RightWnd);
     rightdc.FillSolidRect(&rightrect,RGB(0,0,0));

     //画中线,白色
     CPen pen(PS_SOLID,0,RGB(255,255,255));
     leftdc.SelectObject(&pen);
     leftdc.MoveTo(0,leftHeight/2);
     leftdc.LineTo(leftWidth,leftHeight/2);

     rightdc.SelectObject(&pen);
     rightdc.MoveTo(0,rightHeight/2);
     rightdc.LineTo(rightWidth,rightHeight/2);

     //选择绿色实线画笔,并将画笔移动到起点
     pen.DeleteObject();
     pen.CreatePen(PS_SOLID,1,RGB(0,255,0));
     leftdc.SelectObject(&pen);
     leftdc.MoveTo(0,leftHeight/2);

     //申请内存空间,存放波形数据
     SINT *pDataTemp = (SINT *)malloc(sizeof(SINT));
     memset(pDataTemp,0,sizeof(SINT));

     //画左声道波形
     int xl,yl;

     for(int i=0;i<SumPot;i++)
     {
          //读取波形数据进入内存临时空间
          fseek(WavFile,44+i*4,SEEK_SET);
          fread(pDataTemp,sizeof(SINT),1,WavFile);
          //将波形数据存入数组中
          leftData[i] = *pDataTemp + 32768;

          //计算画图比例
          yl = leftHeight/2*abs(*pDataTemp)/32768;
          xl = leftWidth*i/SumPot;

          if(*pDataTemp>=0)
               leftdc.LineTo(xl,leftHeight/2-yl);
          else
               leftdc.LineTo(xl,leftHeight/2+yl);
     }

     //选择绿色画笔作为右声道图形颜色,并将画笔移动至起点
     int xr,yr;
     rightdc.SelectObject(&pen);
     rightdc.MoveTo(0,rightHeight/2);

     //画右声道波形
     for(int i=0;i<SumPot;i++)
     {
          //读取波形数据进入内存临时空间
          fseek(WavFile,46+i*4,SEEK_SET);
          fread(pDataTemp,sizeof(SINT),1,WavFile);
          //将波形数据存入数组中
          rightData[i] = *pDataTemp + 32768;

          //计算画图比例
          yr= rightHeight/2*abs(*pDataTemp)/32768;
          xr = rightWidth*i/SumPot;

          if(*pDataTemp>=0)
               rightdc.LineTo(xr,rightHeight/2-yr);
          else
               rightdc.LineTo(xr,rightHeight/2+yr);
      }
     free(pDataTemp);

}

 

参数说明:

WavFile是一个指向FILE文件类型的指针,可以用WavFile = fopen("文件路径","r")获得,SumPot是总采样点数,可以通过WAV文件头中的信息得到,函数中的IDC_WAVEL何IDC_WAVER分别是左右声道的绘图控件ID。

 

本代码在windows7下的VS2008编译环境中编译通过。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值