我的代码 - >显示波形立体声.wav文件
max_l和max_r here是每个通道中波形的最高值。
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);
答案 0 :(得分:0)
这取决于您的已安装和可用内存(除了其他因素,如OS版本(七个更好),OS版本(64位更好),已分配的位图数量。
如果您遇到此问题但无法通过更多硬件解决,则应将图像平铺在多个子图像中,并将输出调整为更接近标准显示器分辨率的值。
答案 1 :(得分:0)
将TImage组件放在TScrollBox中并在TImage中设置AutoSize选项,并使用[MaxInt]获取整数的最大值。
Image1.AutoSize := true;
当我在玩这个项目时,指向我试图显示的大文件中的[AutoSize]问题。 https://community.embarcadero.com/blogs/entry/converting-to-grayscale-with-tbitmapscanline-property-39051
来自.. https://community.embarcadero.com/blogs/entry/converting-to-grayscale-with-tbitmapscanline-property-39051 - [uBitmapUtils.pas]
的MaxInt示例TBGR32 = packed record
B, G, R, A: Byte;
end;
TBGR32Array = packed array[0..MaxInt div SizeOf(TBGR32)-1] of TBGR32;
PBGR32Array = ^TBGR32Array;