Delphi根据音频数据画波形

来源:互联网 发布:xy坐标转换经纬度软件 编辑:程序博客网 时间:2024/05/16 19:09
  1. //***********************************************************************// 
  2. //                                                                       // 
  3. //   画放音时的动态波形                                                  // 
  4. //   参数:                                                               // 
  5. //       Buf            : 音频数据指针                                   // 
  6. //       Length         : 音频数据的长度                                 // 
  7. //       DesCanvas      : 用来显示波形的目标画布                         // 
  8. //       DH, DW         : 目标画布工作区的高度与宽度                     // 
  9. //       Min, Max       : 音频数据的最小值与最大值                       // 
  10. //       DrawLineColor  : 画波形的颜色                                   // 
  11. //       DrawBackColor  : 画波形的背景颜色                               // 
  12. //       StartPoi       : 开始画波形的位置                               // 
  13. //       DrawLength     : 要画的波形的数据的长度                         // 
  14. //   返回值: 无                                                          // 
  15. //                                                                       // 
  16. //***********************************************************************// 
  17. procedure HawDrawWave(Buf: PChar; Length: LongInt; DesCanvas: TCanvas; 
  18.          DH, DW: SmallInt; Min, Max: LongInt; DrawLineColor, DrawBackColor: TColor; 
  19.          StartPoi: LongInt = 0; DrawLength: LongInt = 0); 
  20. Var 
  21.   i: LongInt; 
  22.   Y: SmallInt; 
  23.   DesBitMap: TBitMap; 
  24. begin 
  25.  DesBitMap := TBitMap.Create; 
  26.  with DesBitMap do     //初始化图像对像 
  27.  begin 
  28.     Width := DW; 
  29.     Height := DH; 
  30.     Canvas.Brush.Color := DrawBackColor; 
  31.     Canvas.Brush.Style := bsSolid; 
  32.     Canvas.Pen.Color := DrawLineColor; 
  33.     Canvas.Pen.Mode := pmCopy; 
  34.     Canvas.FillRect(Rect(00, DW, DH)); 
  35.     Canvas.MoveTo(0, DH DIV 2); 
  36.     Canvas.LineTo(DW, DH DIV 2); 
  37.  end
  38.  if ((Length = 0or (Buf = NIL)) then 
  39.  begin 
  40.     BitBlt(DesCanvas.Handle, 00, DW, DH, DesBitMap.Canvas.Handle, 00, SRCCOPY); 
  41.     Exit; 
  42.  end
  43.  if (StartPoi MOD 2) = 1 then 
  44.     StartPoi := StartPoi + 1
  45.  if StartPoi >= Length then 
  46.     StartPoi := 2
  47.  if DrawLength div 2 > DW then         //开始处 
  48.     DrawLength := DW * 2
  49.  if (StartPoi + DrawLength) > Length then 
  50.     DrawLength := Length - StartPoi; 
  51.  if DrawLength <= 0 then 
  52.     DrawLength := DW * 2
  53.                                             
  54.  Max := Max - Min; 
  55.  for i := 0 to (DrawLength div 2 -1do 
  56.  begin 
  57.     if Max <> 0 then 
  58.        Y := Abs(PCMInt(PChar(Buf) + StartPoi + i * 2)^ - Min) * DH div Max 
  59.     else 
  60.        Y := 0
  61.        Y := ABS(DH DIV 2 - Y); 
  62.        if Y >= (DH DIV 2then 
  63.           continue; 
  64.        //画波形 
  65.        DesBitMap.Canvas.MoveTo(i, DH DIV 2 - Y); 
  66.        DesBitMap.Canvas.LineTo(i, DH DIV 2 + Y); 
  67.     if i > DW then break; 
  68.  end
  69.  //复制图像 
  70.  BitBlt(DesCanvas.Handle, 00, DW, DH, DesBitMap.Canvas.Handle, 00, SRCCOPY); 
  71.  DesBitMap.Free; 
  72. end
  73. 来自: yostgxf, 时间: 2005-01-18 21:52:21, ID: 2969407  
  74. 录音时的图形 
  75. //***********************************************************************// 
  76. //                                                                       // 
  77. //   画局部音频数据的波形                                                // 
  78. //   参数:                                                               // 
  79. //       Flag           : 波形显示周期                                   // 
  80. //       Buf            : 音频数据                                       // 
  81. //       Length         : 音频数据的长度                                 // 
  82. //       DesCanvas      : 要显示波形的目标画布                           // 
  83. //       DH, DW         : 目标画布的工作区域的高度与宽度                 // 
  84. //       DesBitMap      : 画波形时用的非可视源位图对像                   // 
  85. //       DrawLineColor  : 画波形的颜色                                   // 
  86. //       DrawBackColor  : 画波形的背景颜色                               // 
  87. //       Draw           : 是否画波形                                     // 
  88. //   返回值: 无                                                          // 
  89. //                                                                       // 
  90. //***********************************************************************// 
  91. procedure DrawPartWave(const Flag: Integer; Buf: PChar; Length: LongInt; 
  92.          DesCanvas: TCanvas; DH, DW: SmallInt; DesBitMap: TBitMap; 
  93.          DrawLineColor, DrawBackColor: TColor; Draw: Boolean = True); 
  94. var 
  95.   i, j, k, lmax, lmin: LongInt; 
  96.   Max, Min: LongInt; 
  97.   X, Y: SmallInt; 
  98. begin 
  99.  with DesBitMap do     //初始化图像参数 
  100.  begin 
  101.     Width := DW; 
  102.     Height := DH; 
  103.     Canvas.Brush.Color := DrawBackColor; 
  104.     Canvas.Brush.Style := bsSolid; 
  105.     Canvas.Pen.Color := DrawLineColor; 
  106.     Canvas.Pen.Mode := pmCopy; 
  107.     Canvas.FillRect(Rect(00, DW, DH)); 
  108.  end
  109.  if ((Length = 0) Or (Buf = NIL)) then 
  110.  begin //清除 
  111.     BitBlt(DesCanvas.Handle, 00, DW, DH, DesBitMap.Canvas.Handle, 00, SRCCOPY); 
  112.     Exit; 
  113.  end
  114.  Max := -32768
  115.  Min := 32767
  116.  for i := 0 to (Length div 2 -1 ) do   //取到最小值与最大值 
  117.  begin 
  118.     j := PCMInt(PChar(Buf) + i * 2)^; 
  119.     if j > Max then Max := j; 
  120.     if j < Min then Min := j; 
  121.  end
  122.  DrawMin := Min; 
  123.  DrawMax := Max; 
  124.  if Not Draw then 
  125.  begin 
  126.     Exit; 
  127.  end
  128.  Max := Max - Min;     //最大振幅 
  129.  DesBitMap.Canvas.MoveTo(0, DH div 2); 
  130.  j := 0
  131.  X := 0
  132.  lmax := 0
  133.  lmin := 32767
  134.  for i := 0 to ((Length) div 2 -1do 
  135.  begin 
  136.     if j < (Flag - 1then     //如果是在一个周期内 
  137.     begin 
  138.        INC(j); 
  139.     end 
  140.     else begin 
  141.       j := 0
  142.       X := X + 1
  143.       lmax := 0
  144.       lmin := 32767
  145.     end
  146.     if Max <> 0 then           //取音频数据转换在整数 
  147.        Y := Abs(PCMInt(PChar(buf) + i * 2)^ - Min) * DH div Max 
  148.     else 
  149.        Y := DH div 2
  150.     k := 0
  151.     if Y > lmax then 
  152.     begin 
  153.        lmax := Y; 
  154.        k := 1
  155.     end
  156.     if Y < lmin then 
  157.     begin 
  158.        lmin := Y; 
  159.        k := 1
  160.     end
  161.     if k = 1 then 
  162.        DesBitMap.Canvas.LineTo(X, Y);  //画线 
  163.     if X > DW then break; 
  164.  end
  165.  //图像复制                                                             拷贝 
  166.  BitBlt(DesCanvas.Handle, 00, DW, DH, DesBitMap.Canvas.Handle, 00, SRCCOPY); 
  167. end