在生成大量位图时,位图创建会变为全黑

时间:2012-12-04 10:53:03

标签: flash delphi bitmap delphi-7

我正在使用Delphi 7,我必须从我的Delphi应用程序中嵌入的FlashMovie生成大量位图。 图片的定义是1010x720。

当我生成超过6000张图片(每次都有不同的数字)时,我会收到EOutOfResources异常。 我环顾四周,看来它可能来自缺乏可用的手柄。

以下是代码:

var
FFlashPlayerControlExport:TFlashPlayerControl;
Bmp:TBitmap;
pPNG:TPNGObject;

begin
Bmp := FFlashPlayerControlExport.CreateFrameBitmap;
Bmp.Width := StrToInt(aArgs[5]);
Bmp.Height := StrToInt(aArgs[6]);

pPNG := TPNGObject.Create;
pPNG.Assign(Bmp);
pPNG.SaveToFile(sFileName);
pPNG.Free;

DeleteObject(Bmp.Handle);
Bmp.Free;
end;

我在Bmp.Free之前尝试过CloseHandle(Bmp.Handle),但我得到了一个EExternalException。

谢谢大家的帮助!


2012年12月6日更新:

感谢Arioch的回答,我尝试直接设置FFlashPlayerControlExport的宽度和高度,而不是使用Bmp.Width和Bmp.Height 它有所帮助,因为现在我没有获得EOutOfResources异常,但CreateFrameBitmap在一段时间后保存了全黑图片。

FlashPlayerControl仍在运行,因为我在屏幕上看到了图片。

代码更新:

var
FFlashPlayerControlExport:TFlashPlayerControl;
Bmp:TBitmap;
pPNG:TPNGObject;

begin
FFlashPlayerControlExport.Width := StrToInt(aArgs[5]);
FFlashPlayerControlExport.Height := StrToInt(aArgs[6]);

Bmp := FFlashPlayerControlExport.CreateFrameBitmap;

pPNG := TPNGObject.Create;
pPNG.Assign(Bmp);
pPNG.SaveToFile(sFileName);
pPNG.Free;

Bmp.Free;
end;

2012年12月20日更新:

联系FlashPlayerControl开发团队后,我发现当应用程序达到10.000 GDI对象时,位图会变黑。 他们为我的问题提供了有效的帮助,联系他们是有效的:)

我最终发现GDI对象泄漏来自我代码的另一个并行部分。 这个主题很接近:)

1 个答案:

答案 0 :(得分:0)

当TBitmap创建的句柄被错误代码使用时,可能无法正确清理句柄。此句柄泄漏累积,并且在几次此类泄漏GetDC开始失败后。

EOutOfResource异常的另一个原因是位图的尺寸错误。 VCL单元中的CopyBitmap函数图形调用GDICheck,它总是引发EOutOfResource异常,但也调用GetLastError以提供更合适的错误消息。

根据TPNGObject.Assign的工作原理,您应该在释放之前调用位图上的ReleaseHandleFreeImage

http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.Graphics.TBitmap.ReleaseHandle

http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.Graphics.TBitmap.FreeImage

修改

调用ReleaseHandle可能会使事情变得更糟,因为当没有人负责位图句柄时,它会导致句柄泄漏。

通常没有必要调用FreeImage,但在类似情况下只能帮助我一次。