65.9K
CodeProject 正在变化。 阅读更多。
Home

ShowWaveForm

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (12投票s)

2003年8月22日

viewsIcon

147622

downloadIcon

5325

一个用于处理 .WAV 文件的 C# 类

Sample Image - showwaveform.jpg

引言

ShowWaveForm 基于 Alexander Beletsky 编写的 C++ 类 CWaveFile。这是一个移植到 C# 的版本,并添加了一些新功能。演示项目 .zip 文件中包含一个小 .wav 文件,用于测试。

WaveFile.cs

WaveFile.cs 是主类。它读取并解析 .WAV 文件头。当传递一个 PaintEventArgs(通常来自 OnPaint 事件)时,它将绘制波形。该类还允许缩放波形。

用法

使用该类非常简单。以下是示例项目文件打开菜单处理程序

private void fileOpen_Click(object sender, System.EventArgs e)
{
  OpenFileDialog fileDlg = new OpenFileDialog();

  if ( fileDlg.ShowDialog() == DialogResult.OK )
  {
     wave = new WaveFile( fileDlg.FileName );
     sbpMainPanel.Text = "Reading .WAV file...";
     wave.Read( );
     sbpMainPanel.Text = "Finished Reading .WAV file...";
     m_DrawWave = true;
     Refresh( );
  }
}

以下是演示项目的 Paint 处理程序

private void Form1_Paint( object sender, 
              System.Windows.Forms.PaintEventArgs e
            )
{
  Pen pen = new Pen( ForeColor );
  if ( m_DrawWave )
{ sbpMainPanel.Text = "Drawing .WAV file..."; wave.Draw( e, pen ); sbpMainPanel.Text = "Finished drawing .WAV file..."; } }

演示项目中的最后一个有趣之处是 MouseWheel 处理程序,它控制波形的缩放

protected override void OnMouseWheel( MouseEventArgs mea )
{
 if ( mea.Delta * SystemInformation.MouseWheelScrollLines / 120 > 0 )
  wave.ZoomIn( );
 else
  wave.ZoomOut( );

 Refresh( );

}

问题/讨论

这是我第一次尝试用 C#/.NET 编程。所以请评论这段代码中的所有内容!具体来说,我有一些问题:

  • 对于大文件,波形的绘制非常慢,可能是因为使用了 PageScale
  • 如何捕获缩放过度导致的某些错误
  • 绘制立体声波形
© . All rights reserved.