我正在尝试提取wav文件的音频内容并将结果波形导出为图像(bmp/jpg/png)。如何将音频波形绘制成位图
所以我发现下面的代码绘制一个正弦波,按预期工作:
string filename = @"C:\0\test.bmp";
int width = 640;
int height = 480;
Bitmap b = new Bitmap(width, height);
for (int i = 0; i < width; i++)
{
int y = (int)((Math.Sin((double)i * 2.0 * Math.PI/width) + 1.0) * (height - 1)/2.0);
b.SetPixel(i, y, Color.Black);
}
b.Save(filename);
可正常工作完全,我希望做的是更换
int y = (int)((Math.Sin((double)i * 2.0 * Math.PI/width) + 1.0) * (height - 1)/2.0);
与像
int y = converted and scaled float from monoWaveFileFloatValues
那么,我会如何最好地去做这个以最简单的方式p ossible?
我有2个基本的问题,我需要处理(我认为)
- 转换浮在不松动的信息的方式来诠释,这是由于
SetPixel(i, y, Color.Black);
其中x & y都为诠释 - 样品跳过在x轴,使波形配合到限定空间
audio length/image width
得到的样本数由单个像素
另以平均强度在其将被表示选项是找到不依赖于上述方法的绘制波形的另一种方法。 Using a chart可能是一个好方法,但我希望能够直接渲染图像
这是所有要从控制台应用程序运行,我已经在一个浮动的音频数据(减去标题)阵列。
更新1
下面的代码使我得出使用System.Windows.Forms.DataVisualization.Charting
所需的输出,但它花费了大约30秒,处理27776个样本,同时它做什么,我需要的,它是太很慢很有用。所以我仍然在寻找能够直接绘制位图的解决方案。如下图所示
System.Windows.Forms.DataVisualization.Charting.Chart chart = new System.Windows.Forms.DataVisualization.Charting.Chart();
chart.Size = new System.Drawing.Size(640, 320);
chart.ChartAreas.Add("ChartArea1");
chart.Legends.Add("legend1");
// Plot {sin(x), 0, 2pi}
chart.Series.Add("sin");
chart.Series["sin"].LegendText = args[0];
chart.Series["sin"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
//for (double x = 0; x < 2 * Math.PI; x += 0.01)
for (int x = 0; x < audioDataLength; x ++)
{
//chart.Series["sin"].Points.AddXY(x, Math.Sin(x));
chart.Series["sin"].Points.AddXY(x, leftChannel[x]);
}
// Save sin_0_2pi.png image file
chart.SaveImage(@"c:\tmp\example.png", System.Drawing.Imaging.ImageFormat.Png);
所以你有任何代码读取音频文件?删除标题,然后查看数据?这应该是你的开始;只有在绘图之后..而且,不,对于绘制图表的点数并不是真的这么好,imo – TaW
@TaW - “我已经将音频数据(除了标题)放在浮点数组中。 “所以我正在寻找下一步。 – Majickal