当我尝试通过将mp3流传递给以下函数来生成波形图像时,它会在g.DrawLine调用时抛出溢出异常。请纠正我在哪里出错。非常感谢任何帮助。
public static void DrawNormalizedAudio(ref float[] data, Color color)
{
Bitmap bmp= new Bitmap(1800,200);
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);
}
}
bmp.Save("D:\\waveimage.png");
}
public float[] FloatArrayFromStream(System.IO.MemoryStream stream)
{
return FloatArrayFromByteArray(stream.GetBuffer());
}
public float[] FloatArrayFromByteArray(byte[] input)
{
float[] output = new float[input.Length / 4];
for (int i = 0; i < output.Length; i++)
{
output[i] = BitConverter.ToSingle(input, i * 4);
}
return output;
}
答案 0 :(得分:1)
我的第一个想法是你正在绘制一个输出列多于输入的图像,它会为你提供min
和max
的值(因此yMin
和{{1 }}超出范围。我希望在这种情况下yMax
计算会抛出异常。
您应该将yMin
和yMin
值限制在画布上绘图区域的大小,然后在调用{{之前“期间(或期间)添加yMax
偏移量1}}。