0

我的代码 -> 显示波形立体声 .wav 文件

这里的 max_l 和 max_r 是每个通道中波形的最大值。

 form2:= TForm2.Create(self);
 form2.Image1.Visible := true;
 form2.Image1.Width := numsamples;
 form2.Image1.Height := max_l * 2;
 form2.Image1.Canvas.Lock;
 form2.Image1.Canvas.MoveTo(0,mid);
 form2.Image1.Canvas.Pen.Color := clRed
 form2.Image2.Visible := true;
 form2.Image2.Width := numsamples;
 form2.Image2.Height := max_r * 2;
 form2.Image2.Canvas.Lock;
 form2.Image2.Canvas.MoveTo(0,mid);
 form2.Image2.Canvas.Pen.Color := clRed
 x:=0;
    for i := 0 to numchannels do begin
      if i mod 2 = 0 then begin
      form2.Image2.Canvas.MoveTo(x,max_r);
      form2.Image2.Canvas.LineTo(x,max_r+buff[i]);
      x:=x+1;
      end
      else begin
      form2.Image1.Canvas.MoveTo(x,max_l);
      form2.Image1.Canvas.LineTo(x,max_l+buff[i]);
      end;
    end;

我想知道 TImage Delphi 最大高度和宽度的最大值是多少?因为我正在尝试绘制 .wav 文件的整个波形的大图。例如,现在我得到了 image1.height = 23000 并得到了 EOutOfResource 问题,或者我的代码可能有错误?任何建议将不胜感激。

EDIT1:我也尝试使用draw bmp然后用stretchdraw方法调整它但它也不起作用,这是我的代码,主要思想是首先我将超大原始尺寸绘制到bmp中,然后使用StretchDraw函数缩小它然后绘制它在 TImage 上。但仍然位图也给我同样的问题EOutOfResources

 form2:= TForm2.Create(self);
 form2.Image1.Visible := true;
 bmp:=TBitmap.Create;
 bmp.Height:=max_l*2;
 bmp.Width:=numsamples;
 bmp.Canvas.Pen.Color:=clRed;
 bmp.Canvas.MoveTo(0,max_l);
 x:=0;
    for i := 0 to numchannels do begin
      if i mod 2 = 0 then begin
      bmp.Canvas.MoveTo(x,max_r);
      bmp.Canvas.LineTo(x,max_r+buff[i]);
      x:=x+1;
      end;
    end;
newwidth:=1000;
newheight:=500;
bmp.Canvas.StretchDraw(rect(0,0,newheight,newwidth),bmp);
form2.Image1.Canvas.Draw(0,0,bmp);
4

2 回答 2

0

这取决于您安装的和可用的内存(除了操作系统版本(7 位更好)、操作系统版本(64 位更好)、已分配的位图数量等其他因素外)。

如果您遇到此问题并且无法通过更多硬件解决,您应该将图像平铺在几个子图像中,并将输出调整为更接近标准显示器分辨率的大小。

于 2013-05-28T13:57:30.240 回答
0

将 TImage 组件放入 TScrollBox 并在 TImage 中设置 AutoSize 选项,并使用 [MaxInt] 获取 Integer 的最大值。

Image1.AutoSize := true;

当我在玩这个项目时,我试图在一个大文件中显示 [AutoSize] 问题。 https://community.embarcadero.com/blogs/entry/converting-to-grayscale-with-tbitmapscanline-财产 39051

MaxInt 示例来自.. https://community.embarcadero.com/blogs/entry/converting-to-grayscale-with-tbitmapscanline-property-39051 - [uBitmapUtils.pas]

TBGR32 = packed record
  B, G, R, A: Byte;
end;
TBGR32Array = packed array[0..MaxInt div SizeOf(TBGR32)-1] of TBGR32;
PBGR32Array = ^TBGR32Array;
于 2017-01-18T14:46:49.793 回答