- //***********************************************************************//
- // //
- // 画放音时的动态波形 //
- // 参数: //
- // 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根据音频数据画波形
最新推荐文章于 2020-06-26 21:52:27 发布