您的位置:首页 > 编程语言 > Delphi

Delphi根据音频数据画波形

2008-11-25 11:39 519 查看
//***********************************************************************// 

//                                                                       // 

//   画放音时的动态波形                                                  // 

//   参数:                                                               // 

//       Buf            : 音频数据指针                                   // 

//       Length         : 音频数据的长度                                 // 

//       DesCanvas      : 用来显示波形的目标画布                         // 

//       DH, DW         : 目标画布工作区的高度与宽度                     // 

//       Min, Max       : 音频数据的最小值与最大值                       // 

//       DrawLineColor  : 画波形的颜色                                   // 

//       DrawBackColor  : 画波形的背景颜色                               // 

//       StartPoi       : 开始画波形的位置                               // 

//       DrawLength     : 要画的波形的数据的长度                         // 

//   返回值: 无                                                          // 

//                                                                       // 

//***********************************************************************// 

procedure HawDrawWave(Buf: PChar; Length: LongInt; DesCanvas: TCanvas; 

         DH, DW: SmallInt; Min, Max: LongInt; DrawLineColor, DrawBackColor: TColor; 

         StartPoi: LongInt = 0; DrawLength: LongInt = 0); 

Var 

  i: LongInt; 

  Y: SmallInt; 

  DesBitMap: TBitMap; 

begin 

 DesBitMap := TBitMap.Create; 

 with DesBitMap do     //初始化图像对像 

 begin 

    Width := DW; 

    Height := DH; 

    Canvas.Brush.Color := DrawBackColor; 

    Canvas.Brush.Style := bsSolid; 

    Canvas.Pen.Color := DrawLineColor; 

    Canvas.Pen.Mode := pmCopy; 

    Canvas.FillRect(Rect(0, 0, DW, DH)); 

    Canvas.MoveTo(0, DH DIV 2); 

    Canvas.LineTo(DW, DH DIV 2); 

 end; 

 if ((Length = 0) or (Buf = NIL)) then 

 begin 

    BitBlt(DesCanvas.Handle, 0, 0, DW, DH, DesBitMap.Canvas.Handle, 0, 0, SRCCOPY); 

    Exit; 

 end; 

 if (StartPoi MOD 2) = 1 then 

    StartPoi := StartPoi + 1; 

 if StartPoi >= Length then 

    StartPoi := 2; 

 if DrawLength div 2 > DW then         //开始处 

    DrawLength := DW * 2; 

 if (StartPoi + DrawLength) > Length then 

    DrawLength := Length - StartPoi; 

 if DrawLength <= 0 then 

    DrawLength := DW * 2; 

                                            

 Max := Max - Min; 

 for i := 0 to (DrawLength div 2 -1) do 

 begin 

    if Max <> 0 then 

       Y := Abs(PCMInt(PChar(Buf) + StartPoi + i * 2)^ - Min) * DH div Max 

    else 

       Y := 0; 

       Y := ABS(DH DIV 2 - Y); 

       if Y >= (DH DIV 2) then 

          continue; 

       //画波形 

       DesBitMap.Canvas.MoveTo(i, DH DIV 2 - Y); 

       DesBitMap.Canvas.LineTo(i, DH DIV 2 + Y); 

    if i > DW then break; 

 end; 

 //复制图像 

 BitBlt(DesCanvas.Handle, 0, 0, DW, DH, DesBitMap.Canvas.Handle, 0, 0, SRCCOPY); 

 DesBitMap.Free; 

end; 

来自: yostgxf, 时间: 2005-01-18 21:52:21, ID: 2969407  

录音时的图形 

//***********************************************************************// 

//                                                                       // 

//   画局部音频数据的波形                                                // 

//   参数:                                                               // 

//       Flag           : 波形显示周期                                   // 

//       Buf            : 音频数据                                       // 

//       Length         : 音频数据的长度                                 // 

//       DesCanvas      : 要显示波形的目标画布                           // 

//       DH, DW         : 目标画布的工作区域的高度与宽度                 // 

//       DesBitMap      : 画波形时用的非可视源位图对像                   // 

//       DrawLineColor  : 画波形的颜色                                   // 

//       DrawBackColor  : 画波形的背景颜色                               // 

//       Draw           : 是否画波形                                     // 

//   返回值: 无                                                          // 

//                                                                       // 

//***********************************************************************// 

procedure DrawPartWave(const Flag: Integer; Buf: PChar; Length: LongInt; 

         DesCanvas: TCanvas; DH, DW: SmallInt; DesBitMap: TBitMap; 

         DrawLineColor, DrawBackColor: TColor; Draw: Boolean = True); 

var 

  i, j, k, lmax, lmin: LongInt; 

  Max, Min: LongInt; 

  X, Y: SmallInt; 

begin 

 with DesBitMap do     //初始化图像参数 

 begin 

    Width := DW; 

    Height := DH; 

    Canvas.Brush.Color := DrawBackColor; 

    Canvas.Brush.Style := bsSolid; 

    Canvas.Pen.Color := DrawLineColor; 

    Canvas.Pen.Mode := pmCopy; 

    Canvas.FillRect(Rect(0, 0, DW, DH)); 

 end; 

 if ((Length = 0) Or (Buf = NIL)) then 

 begin //清除 

    BitBlt(DesCanvas.Handle, 0, 0, DW, DH, DesBitMap.Canvas.Handle, 0, 0, SRCCOPY); 

    Exit; 

 end; 

 Max := -32768; 

 Min := 32767; 

 for i := 0 to (Length div 2 -1 ) do   //取到最小值与最大值 

 begin 

    j := PCMInt(PChar(Buf) + i * 2)^; 

    if j > Max then Max := j; 

    if j < Min then Min := j; 

 end; 

 DrawMin := Min; 

 DrawMax := Max; 

 if Not Draw then 

 begin 

    Exit; 

 end; 

 Max := Max - Min;     //最大振幅 

 DesBitMap.Canvas.MoveTo(0, DH div 2); 

 j := 0; 

 X := 0; 

 lmax := 0; 

 lmin := 32767; 

 for i := 0 to ((Length) div 2 -1) do 

 begin 

    if j < (Flag - 1) then     //如果是在一个周期内 

    begin 

       INC(j); 

    end 

    else begin 

      j := 0; 

      X := X + 1; 

      lmax := 0; 

      lmin := 32767; 

    end; 

    if Max <> 0 then           //取音频数据转换在整数 

       Y := Abs(PCMInt(PChar(buf) + i * 2)^ - Min) * DH div Max 

    else 

       Y := DH div 2; 

    k := 0; 

    if Y > lmax then 

    begin 

       lmax := Y; 

       k := 1; 

    end; 

    if Y < lmin then 

    begin 

       lmin := Y; 

       k := 1; 

    end; 

    if k = 1 then 

       DesBitMap.Canvas.LineTo(X, Y);  //画线 

    if X > DW then break; 

 end; 

 //图像复制                                                             拷贝 

 BitBlt(DesCanvas.Handle, 0, 0, DW, DH, DesBitMap.Canvas.Handle, 0, 0, SRCCOPY); 

end; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delphi 工作 图形 div