【问题标题】:C# display waveformC#显示波形
【发布时间】:2011-03-17 08:43:14
【问题描述】:

使用这个:

 public static void DrawNormalizedAudio(ref float[] data, PictureBox pb,
    Color color)
{
    Bitmap bmp;
    if (pb.Image == null)
    {
        bmp = new Bitmap(pb.Width, pb.Height);
    }
    else
    {
        bmp = (Bitmap)pb.Image;
    }

    int BORDER_WIDTH = 5;
    int width = bmp.Width - (2 * BORDER_WIDTH);
    int height = bmp.Height - (2 * BORDER_WIDTH);

    using (Graphics g = Graphics.FromImage(bmp))
    {
        g.Clear(Color.Black);
        Pen pen = new Pen(color);
        int size = data.Length;
        for (int iPixel = 0; iPixel < width; iPixel++)
        {
            // determine start and end points within WAV
            int start = (int)((float)iPixel * ((float)size / (float)width));
            int end = (int)((float)(iPixel + 1) * ((float)size / (float)width));
            float min = float.MaxValue;
            float max = float.MinValue;
            for (int i = start; i < end; i++)
            {
                float val = data[i];
                min = val < min ? val : min;
                max = val > max ? val : max;
            }
            int yMax = BORDER_WIDTH + height - (int)((max + 1) * .5 * height);
            int yMin = BORDER_WIDTH + height - (int)((min + 1) * .5 * height);
            g.DrawLine(pen, iPixel + BORDER_WIDTH, yMax, 
                iPixel + BORDER_WIDTH, yMin);
        }
    }
    pb.Image = bmp;
}

我在这一行遇到错误:

g.DrawLine(pen, iPixel + BORDER_WIDTH, yMax, 
            iPixel + BORDER_WIDTH, yMin);

它说操作溢出(不能被零除)或类似的东西。关于这个问题的任何线索?谢谢。

更新: 我用来调用函数的代码是:

fileName = "c:\\sound\\happy_birthday.wav";

        byte[] bytes = File.ReadAllBytes(fileName);
        float[] getval = FloatArrayFromByteArray(bytes);
        DrawNormalizedAudio(ref getval, pictureBox1, Color.White);

【问题讨论】:

  • 类似的东西还是被零除?
  • 此时的 yMax 和 yMin 是多少?
  • @Bobby Alexander - 它只是说附加信息:溢出错误。
  • @jonsca - ymax 是 41,ymin 是 -2147483572。
  • DrawLine 是否可能出于某种原因计算直线的斜率,因为您的 x 值相同,这可能是导致问题的原因,但我不确定。尝试制作第二个 x 值 iPixel+BORDER_WIDTH+5 或其他东西。

标签: c# waveform


【解决方案1】:

您正在除以零。不要这样做,因为这个操作是无效的。检查您传递给DrawLine 的值不是0。

【讨论】:

    【解决方案2】:
     int yMin = BORDER_WIDTH + height - (int)((min + 1) * .5 * height);
    

    您正在使用带符号的 int 数据类型 - 发生的情况是此计算溢出并导致负值,您得到 -2147483572int.MaxValue+75(溢出),可能是 min 很大导致结果比int.MaxValue大75的负值?

    【讨论】:

    • 很抱歉,但我不明白我是如何翻转这些值的。但是,如果 ymin 的值为 75,考虑到 ymax 值为 41,它看起来不合逻辑?
    • @cnewbie: 正在编辑我的答案 - min 的值是多少?
    • 哦,我明白了。对不起。 min 的值为 -3.296672E+38。似乎问题出在最小值对吗?然而,从代码来看,它似乎是从字节数组中获取和处理的。
    • @cnewbie:你有问题
    • @cnewbie:这相当于Math.Min(val, min)
    【解决方案3】:

    minmax 错了,应该是

    float min = float.MinValue;
    float max = float.MaxValue;
    

    【讨论】:

    • 不,它们设置正确 - 在搜索集合中的最大值和最小值之前,max 的初始值应设置为 min,min 的初始值应设置为 max。否则算法将不起作用。
    猜你喜欢
    • 2016-09-29
    • 2011-03-26
    • 2016-12-09
    • 2018-05-19
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2017-08-02
    相关资源
    最近更新 更多