使用图片框绘制波浪文件

本文关键字:文件 绘制 | 更新日期: 2023-09-27 17:50:15

我想知道下面代码中的错误。我想绘制包含波文件样本的数组的值。在表单中我添加了panel,并在里面添加了picturebox。

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;
}

使用图片框绘制波浪文件

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

我已经用系统中可用的缩放和转换方法替换了你的代码。图纸名称空间。这确实让我看到了我的一个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;