用GDI+在panel中画出NAudio加载出来的音频波形图像的完整程序
时间: 2024-03-21 10:44:07 浏览: 49
使用GDI+绘制图形
以下是一个完整的程序,它可以使用NAudio加载音频文件,并将波形图像绘制在Windows Forms应用程序的Panel控件中。
```csharp
using System;
using System.Drawing;
using System.Windows.Forms;
using NAudio.Wave;
namespace WaveformVisualization
{
public partial class Form1 : Form
{
private WaveFileReader waveFileReader;
private float[] waveform;
public Form1()
{
InitializeComponent();
}
private void openButton_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
// 打开音频文件
waveFileReader = new WaveFileReader(openFileDialog.FileName);
// 转换为波形数据
waveform = GetWaveform(waveFileReader);
// 在panel中绘制波形图像
DrawWaveformInPanel(waveformPanel, waveform);
}
}
private void playButton_Click(object sender, EventArgs e)
{
if (waveFileReader != null)
{
// 播放音频文件
WaveOut waveOut = new WaveOut();
waveOut.Init(waveFileReader);
waveOut.Play();
}
}
private void DrawWaveformInPanel(Panel panel, float[] waveform)
{
// 创建一个位图对象
Bitmap bitmap = new Bitmap(panel.Width, panel.Height);
// 创建一个绘图对象
Graphics graphics = Graphics.FromImage(bitmap);
// 设置绘制参数
Pen pen = new Pen(Color.Black, 1);
int center = panel.Height / 2;
// 绘制波形图像
for (int i = 0; i < waveform.Length - 1; i++)
{
float x1 = i * panel.Width / waveform.Length;
float y1 = center - waveform[i] * center;
float x2 = (i + 1) * panel.Width / waveform.Length;
float y2 = center - waveform[i + 1] * center;
graphics.DrawLine(pen, x1, y1, x2, y2);
}
// 在panel上显示波形图像
panel.BackgroundImage = bitmap;
}
private float[] GetWaveform(WaveFileReader waveFileReader)
{
// 获取音频文件的采样率和通道数
int sampleRate = waveFileReader.WaveFormat.SampleRate;
int channels = waveFileReader.WaveFormat.Channels;
// 创建一个缓冲区
byte[] buffer = new byte[waveFileReader.Length];
waveFileReader.Read(buffer, 0, buffer.Length);
// 将字节数组转换为浮点数数组
float[] samples = new float[buffer.Length / 2];
for (int i = 0; i < samples.Length; i++)
{
short sample = BitConverter.ToInt16(buffer, i * 2);
samples[i] = (float)sample / (float)short.MaxValue;
}
// 计算每个采样周期的平均值
float[] waveform = new float[samples.Length / channels];
for (int i = 0; i < waveform.Length; i++)
{
float sum = 0;
for (int j = 0; j < channels; j++)
{
sum += samples[i * channels + j];
}
waveform[i] = sum / channels;
}
return waveform;
}
}
}
```
这个程序包含了打开音频文件、播放音频文件和绘制波形图像的功能。当用户打开一个音频文件时,它会将音频文件加载到WaveFileReader对象中,并使用GetWaveform函数将音频数据转换为波形数据。然后,它会在波形面板上绘制波形图像,并将其显示出来。当用户点击播放按钮时,它会使用NAudio的WaveOut对象播放音频文件。
阅读全文