2012-02-28 108 views
7

我希望在未来的C#.NET 4.0中使用一些音频项目,所以我收集了一些音频录制代码示例,WAVE文件等工作。但是我没有什么无法找到的是:实时图形绘制(波形)

如何实时绘制音频波形/光谱图(ish)?显然,创建一个内存中的位图并将其加载到图片框中会很慢,对吧?那么,最简​​单的方法是什么?

谢谢!

+0

看起来像一个重复的问题 - 退房:http://stackoverflow.com/questions/5606367/how-to-create- sound-spectrogram-in-c(C#,尽管链接) – holtavolt 2012-02-28 17:32:04

+1

对于实时波形显示,您可能需要查看硬件加速图形 - 我认为可怜的旧GDI +能够很好地应对。我认为最好的做法是简单地将包含音频数据的环形缓冲区直接发送到显卡,以便由着色器渲染为纹理。你甚至可以在着色器中做FFT,如果你想:) – MattDavey 2012-02-28 17:37:09

+0

我很想知道这个答案。论坛传言称Direct2D是最快的.NET屏幕绘画API,但我从未见过使用它的WinForms应用程序。你必须使用WinForms? – 2012-02-28 17:41:16

回答

1

您可以使用基于GDI +的Graphics and Drawing in Windows Forms直接绘制您的内容。这将比渲染到位图并在图片框中显示不断变化的内容快得多。

+0

对于光谱图,我必须画出基本相当于位图的内容。 GDI +处理得好吗? – John 2012-02-28 17:49:53

+0

@John相对来说 - 它将比绘制位图和渲染更快。 – 2012-02-28 17:56:43

+0

我不同意。绘制屏幕控制比绘制位图并更改它慢。我用秒表尝试过。 5K线。以下是结果: 屏幕控制:2772ms 位图&更改:85ms 双缓冲屏幕控制:2657ms – Onur 2012-02-28 18:12:51

1

只需在合适的控制面即面板上直接涂漆即可。获取控件的图形上下文,并使用Invalidate()函数在Paint-event中更新它。每次无效时,Paint都会自动调用。这是你想要放置绘图逻辑的地方。

更新它的最好方法是使用DrawImageUnscaled()。本身是最快与LockBits方法制造的形象,出色地解释这里:

http://www.bobpowell.net/lockingbits.htm