Flash 生成大量位图时,位图创建将变为全黑

Flash 生成大量位图时,位图创建将变为全黑,flash,delphi,bitmap,delphi-7,Flash,Delphi,Bitmap,Delphi 7,我正在使用Delphi7,我必须从嵌入Delphi应用程序中的FlashMovie生成大量位图。 图片的清晰度为1010x720 当我生成6000多张图片时(每次的数字都不同),我会得到一个例外。 我环顾四周,似乎是因为缺少可用的手柄 代码如下: var FFlashPlayerControlExport:TFlashPlayerControl; Bmp:TBitmap; pPNG:TPNGObject; begin Bmp := FFlashPlayerControlExport.Creat

我正在使用Delphi7,我必须从嵌入Delphi应用程序中的FlashMovie生成大量位图。 图片的清晰度为1010x720

当我生成6000多张图片时(每次的数字都不同),我会得到一个例外。 我环顾四周,似乎是因为缺少可用的手柄

代码如下:

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 这很有帮助,因为现在我没有遇到OutofResources异常,但是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开发团队后,我发现当应用程序达到10000个GDI对象时,位图会变黑。 他们为我的问题提供了有效的帮助,联系他们很有效:)

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

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

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

根据
TPNGObject.Assign
的工作方式,在释放位图之前,应在位图上调用
releasehold
FreeImage

编辑:

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


调用
FreeImage
通常是不必要的,但在类似情况下只帮助了我一次。

您可以尝试添加。。。在提出异常之前。。。关闭应用程序并检查是否有内存泄漏,以及什么类型的对象不是空闲的……对于处理泄漏,请咨询以下问题:代码看起来很干净。当然,您应该使用try/finally。不要调用
DeleteObject
。让它发生在
TBitmap
析构函数中。其他内容正在泄漏。您是否尝试了原始支持论坛?对于300美元的价格标签,他们应该给你支持,他们在那里相当活跃<代码>Bmp.Width:=stroint(aArgs[5])这行代码看起来也很奇怪。你真的做了6000次吗?1:在循环之前进行一次stroint。为什么在创建位图后调用它?2:是否在一行中调整大小3:是否在创建位图之前设置导出到F-in-BOX组件的大小?我不想下载20MB的演示,但我认为应该有一种方法,而且应该有所不同sequence@DavidHeffernan我有一个非常相似的案例。当您不断创建和销毁位图时,会导致资源丢失。在我的例子中,我正在将位图添加到TImageList中。我毫不怀疑您已经看到类似的问题。只是这个提议的解决方案看起来不像一个解决方案。如果这真的是一个解决方案,也许您可以解释为什么Q中的代码会泄漏位图处理。就目前的情况来看,这看起来像是反复试验的编程。@DavidHeffernan你说得对,我真的无法解释解决方案。失败的操作是Vcl中的GetDC。Graphics
CopyBitmap
。GetDC和ReleaseDC之间必须存在不匹配,这是由
FreeImage
“修复”的。我不知道为什么/没有时间调查。@Jens-你能换一个独立于VCL的库吗?比如Graphics32.org或者Vampyre Imaging?潜入GDI上下文只是为了将一个内存中的图像复制到另一个,这对我来说简直是太过分了!我想知道这是否只适用于香草Delphi7.0。看起来他们在Delphi 7 Update 1中修复了非常类似的问题:并且-或者在TPngImage.Assign中存在类似的泄漏?