私は 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 オブジェクトのリークがコードの別の並列部分から発生していることを発見しました。この主題は近いです:)