使用picturebox绘制波形文件

时间:2014-03-14 17:53:38

标签: c# .net winforms gdi+

我想知道以下代码中的错误。我想绘制包含wave文件samples的数组的值。在我放置面板和在其中的图片框中。

private void button1_Click(object sender, EventArgs e)
{
    string ss = "test.wav";
    double[] xxwav = prepare(ss);
    int xmin = 300; int ymin = 250; int xmax = 1024; int ymax = 450;
    int xpmin = 0; int xpmax = xxwav.Length; int ypmin = 32767; int ypmax = -32768;
    double a = (double)((xmax - xmin)) /(double) (xpmax - xpmin);
    double b = (double)(xpmin - (a * xmin));
    double c = (double)((ymax - ymin) /(double) (ypmax - ypmin));
    double d = (double)(ypmin - (c * ymin));
    double xp1,yp1,xp2,yp2;
    Pen redPen = new Pen(Color.Red, 1);
    Bitmap bmp = new Bitmap(40000, 500);
    Graphics g = Graphics.FromImage(bmp);

    PointF p1;
    PointF p2;
    for (int i = 1; i < xxwav.Length; i++)
    {
        xp1 = a * (i-1) + b;
        yp1 = c * xxwav[i-1] + d;

        xp2=a * i + b;
        yp2=c * xxwav[i] + d;

        p1 =new PointF ((float)xp1,(float)yp1);
        p2 =new PointF ((float)xp2,(float)yp2);
        g.DrawLine(redPen, p1, p2);
    }
    pictureBox1.Image = bmp;

    MessageBox.Show("complete");
}

public static Double[] prepare(String wavePath)
{
    Double[] data;
    byte[] wave;
    byte[] sR = new byte[4];
    System.IO.FileStream WaveFile = System.IO.File.OpenRead(wavePath);
    wave = new byte[WaveFile.Length];
    data = new Double[(wave.Length - 44) / 4];//shifting the headers out of the PCM data;
    WaveFile.Read(wave, 0, Convert.ToInt32(WaveFile.Length));//read the wave file into the wave variable
    /***********Converting and PCM accounting***************/
    for (int i = 0; i < data.Length; i++)
    {
        data[i] = BitConverter.ToInt16(wave, i * 2) / 32768.0;
    }
    //65536.0.0=2^n,       n=bits per sample;

    return data;
}

1 个答案:

答案 0 :(得分:1)

只有在摆弄了转换和缩放参数后,您的代码才能为我工作。

我已使用System.Drawing命名空间中提供的scalingtransformation方法替换了您的代码。这确实让我看到了我的一个wav文件。您只需要替换private void button1_Click(object sender, EventArgs e)实施。

var xxwav =   prepare(wavFile);

// determine max and min 
var max = (from v in xxwav
            select  v).Max();
var min = (from v in xxwav
            select v).Min();

// what is our Y-axis scale
var mid = (max - min);

Pen redPen = new Pen(Color.Red, 1);
Bitmap bmp = new Bitmap(this.pictureBox1.Size.Width, this.pictureBox1.Size.Height);

Graphics g = Graphics.FromImage(bmp);

// x / y position (y-axis to the middle)
g.TranslateTransform(
    0
    , this.pictureBox1.Size.Height / 2);

// scaling according to picturebox size
g.ScaleTransform(
    (float)this.pictureBox1.Size.Width / (float)xxwav.Length
    , (float)this.pictureBox1.Size.Height / ((float)mid));

//first point
var prev = new PointF(0, (float)xxwav[0]);
// iterate over next points
for (int i = 1; i < xxwav.Length; i++)
{     
    var next = new PointF((float) i , (float) xxwav[i]  );
    g.DrawLine(redPen, prev, next);
    prev = next;
}

pictureBox1.Image = bmp;