BMP.HeightまたはBMP.Widthを設定しようとすると、BMPファイルを操作しようとすると「EOutofresources - ストレージが不足しています。これらの命令の後にImediatelly、スタックトレースは(この順序で) ntdll.dll.RtlLeaveCriticalSection、kernel32.dll.FileTimeToDosDateTime、GDI32.dll.GdiReleaseDC、GDI32.dll.PatBlt、kernel32.dll.ReadFileまたは次のようになります。ビットマップで作業中に「ストレージが不足しています」というエラーが発生しました
|7E429130|user32.dll GetParent
|7C90FF2D|ntdll.dll RtlGetNtGlobalFlags
|77F15A00|GDI32.dll GdiReleaseDC
|7C83069E|kernel32.dll FileTimeToDosDateTime
|7C9010E0|ntdll.dll RtlLeaveCriticalSection
| |my function (where I set BMP.Height or BMP.Width)
現時点では私はそれがメモリの断片化で何かを持っていることを確認しました - システムは、私の画像を処理するのに十分な空きRAMがあったが、私のイメージを保持するのに十分な大き一切ブロックがなかったので、メモリが断片化されました。しかし、その後私はそれがWindowsの起動後11秒に1回起こっているのを見ました。私のプログラムは、私が一度だけ画像を処理するループを循環しました!したがって、これはRAMの断片化に関連するものではありません。
異なる状況(まだ図面に関連した)、私はこのエラーを得たときは、以下の通りです:
|77F16A7E|GDI32.dll IntersectClipRect
|77F16FE5|GDI32.dll BitBlt
|7E429011|user32.dll OffsetRect
|7E42A97D|user32.dll CallWindowProcA
|7E42A993|user32.dll CallWindowProcA
|7C9010E0|ntdll.dll RtlLeaveCriticalSection
|7E4196C2|user32.dll DispatchMessageA
|7E4196B8|user32.dll DispatchMessageA
|0058A2E1|UTest.exe UTest.dpr
|7C90DCB8|ntdll.dll ZwSetInformationThread
私はBMP.Height後のスタックトレースの「RtlLeaveCriticalSection」コールが常にあると思います。
thisというポストが、Windowsレジストリキーを編集して解決策を示しています。しかし、この記事はWin XPだけに当てはまると言います。私のエラーが勝つ7
にも見えますが、私は多くの類似の記事を参照してください(そのうちのいくつかは、近いディスクにファイルを保存するに接続されている)が、誰もが、彼は、エラーを修正したことを報告するために戻って来なかったまで。
更新:
あなたが要求したように、これはエラーが表示されたコードです:
procedure TMyBitmap.SetLargeSize(iWidth, iHeight: Integer);
CONST ctBytesPerPixel= 3;
begin
{ Protect agains huge/empty images }
if iWidth< 1 then iWidth:= 1 else
if iWidth> 32768 then iWidth:= 32768;
if iHeight< 1 then iHeight:= 1 else
if iHeight> 32768 then iHeight:= 32768;
{ Set image type }
if iWidth * iHeight * ctBytesPerPixel > 9000000 {~9MB}
then HandleType:= bmDIB { Pros and cons: -no hardware acceleration, +supports larger images }
else HandleType:= bmDDB;
{ Total size is higher than 1GB? }
if (iWidth* iHeight* ctBytesPerPixel) > 1*GB then
begin
Width := 8000; { Set a smaller size }
Height := 8000; { And rise an error }
RAISE Exception.Create('Image is too large.');
end;
{ Set size }
Width := iWidth; <----------------- HERE
Height:= iHeight;
end;
ソースコードを表示してください...メモリリークよりもリソースリーク(ハンドルリーク)のように聞こえる... – Yahia
ビットマップの大きさはどれくらいですか? –
ビットマップのサイズは任意です。通常は、通常のデジタルカメラの画像(4-16メガピクセル)である必要があります。 – Ampere