我正在使用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对象泄漏来自我代码的另一个并行部分。 这个主题很接近:)
答案 0 :(得分:0)
当TBitmap创建的句柄被错误代码使用时,可能无法正确清理句柄。此句柄泄漏累积,并且在几次此类泄漏GetDC
开始失败后。
EOutOfResource
异常的另一个原因是位图的尺寸错误。 VCL单元中的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
,但在类似情况下只能帮助我一次。