实时图形绘制(波形)

8
我将来希望能够使用C# .NET 4.0进行一些音频项目,因此我收集了一些有关音频录制、处理WAVE文件等的代码示例。但是我找不到的是:
如何实时绘制音频波形图/频谱图?显然,创建一个内存位图并将其加载到图片框中会非常缓慢,对吧?那么,最简单的方法是什么?
谢谢!

看起来是一个重复的问题 - 请查看:http://stackoverflow.com/questions/5606367/how-to-create-sound-spectrogram-in-c (尽管链接中提到了C#) - holtavolt
1
对于实时波形显示,您可能需要考虑使用硬件加速图形 - 我认为老旧的GDI+无法很好地处理。我建议最好的方法是将包含音频数据的环形缓冲区直接发送到图形卡以通过着色器呈现为纹理。如果您想要的话,甚至可以在着色器中进行FFT :) - MattDavey
我也很想知道这个问题的答案。论坛传说Direct2D是最快的.NET屏幕绘制API,但我从未见过使用它的WinForms应用程序。你必须使用WinForms吗? - Dour High Arch
holtavolt,我看到了那些问题,但似乎没有什么令人满意的答案/链接。其中一个在codeproject上使用了“不安全”的代码来绘制图像。我宁愿找到“正确”的方法来做这件事... - John
根据您的需求,GDI+应该足够快来生成频谱图。我曾经使用GDI+创建过3D CAD程序,在第一代上网本的高清显示器上全屏运行非常流畅。有很多方法可以加速处理速度。您的音频处理可能会成为瓶颈,但即使在2012年的计算机上也不应该是问题。 - Pedery
2个回答

1

您可以使用基于GDI+的Windows窗体中的图形和绘图直接绘制您的内容。这比将内容渲染到位图并在图片框中显示要快得多,特别是对于不断变化的内容。


对于频谱图,我需要绘制基本上相当于位图的东西。GDI+能很好地处理这个吗? - John
@John 相对来说还是不错的 - 它仍然比绘制位图和渲染要快。 - Reed Copsey
我不同意。在屏幕上绘制控件比绘制到位图并更改要慢。我用秒表试过了。5K行。以下是结果: 屏幕上的控件:2772毫秒 位图和更改:85毫秒 双缓冲屏幕控件:2657毫秒 - Onur

1

直接在适当的控件表面,例如一个Panel上进行绘画。获取控件的图形上下文,并使用Invalidate()函数在Paint事件中更新它。每次使其无效时,Paint会自动调用。这是您想要放置绘图逻辑的地方。

最好的更新方法是使用DrawImageUnscaled()。利用LockBits方法制作图像是最快的方法,这里有很好的解释:

https://web.archive.org/web/20141229164101/http://bobpowell.net/lockingbits.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接