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 の回答のおかげで、Bmp.Width と Bmp.Height を使用する代わりに、FFlashPlayerControlExport の幅と高さを直接設定しようとしました。これは、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が数回発生すると、失敗し始めます。

例外のもう 1 つの理由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 に答える