2

我正在使用 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'The 的回答,我尝试直接设置 FFlashPlayerControlExport 的 Width 和 Height,而不是使用 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 对象泄漏来自我代码的另一个并行部分。这个主题很接近:)

4

1 回答 1

0

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

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

根据TPNGObject.Assign工作方式,您应该在释放它之前调用ReleaseHandle或在位图上。FreeImage

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

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

编辑:

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

FreeImage通常不需要打电话,但在类似情况下只帮助过我一次。

于 2012-12-04T11:03:59.393 回答