web-dev-qa-db-ja.com

メモリ不足Image.FromFile

メモリ不足エラーが発生するのはなぜですか?ありがとうございました

if (File.Exists(photoURI))
{
    FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
    Image img = Image.FromStream(fs);
    fs.Close();
}
18
xscape

の中に - Image.FromFile のドキュメント、OutOfMemoryExceptionは次の場合にスローされます:

ファイルに有効な画像形式がありません。

-または-

GDI +は、ファイルのピクセル形式をサポートしていません。

画像形式を確認してください。

また、画像を読み込んだ直後にストリームを閉じたい場合は、画像のコピーを作成する必要があります。ご覧ください こちら 。 GDI +は、イメージの存続期間中、ストリームを開いたままにする必要があります。

29
Jordão

最初の間違い:

if (File.Exists())

ファイルシステムは揮発性であるため、ファイルへのアクセスは、if条件のある行と次の行の間で変わる可能性があります。それだけでなく、File.Exists()がtrueを返すこともありますが、ファイルのセキュリティ権限がない場合やファイルがすでにロックされている場合は、FileStreamが例外をスローする可能性があります。

代わりに、これを処理する正しい方法は、try/catchブロックを使用することです。とにかくそのコードを書く必要があるので、代わりに開発時間を例外ハンドラに費やしてください。

2番目の間違い:

fs.Close();

この行は、finallyブロック内になければなりません。ま​​たは、開いているファイルハンドルをそのままにしておく可能性があります。通常、この種のリソースが適切に破棄されるようにusingブロックをお勧めしますが、既にtry/catchが必要なため、代わりに次のようなコードを使用できます。

Image img = null;
FileStream fs = null;
try
{
    fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);    
    img = Image.FromStream(fs);    
}
finally
{
    fs.Close();
}
7
Joel Coehoorn

ファイルにImage.FromStreamを使用することはできません。代わりに、TiffBitmapDecoderを使用してファイルをデコードする必要があります。 MSDNのサンプルコード:

// Open a Stream and decode a TIFF image
Stream imageStreamSource = new FileStream("tulipfarm.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];

// Draw the Image
Image myImage = new Image();
myImage.Source = bitmapSource;
myImage.Stretch = Stretch.None;
myImage.Margin = new Thickness(20);
3
Rahman Roohi

私は同じ問題を抱えていましたが、画像またはビットマップのメモリ不足の例外があり、サイズを変更して、パネルや画像ボックスにペイントしました。私には記憶があったので、例外は私の場合は少し赤いニシンでした。

PCを数時間キックした後、サードパーティであることがわかりましたDLLストリームを閉じていませんでした。実際にメモリがあるかどうかを確認するのに役立つ可能性があるいくつかの 'writeline'デバッグ利用可能:

proc = Process.GetCurrentProcess();
Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64);
2
Sam

Hans Passantによる this reply を参照してください。

GDI +は、.NETが登場するかなり前から書かれていました。そのSDKラッパーはC++で書かれています。互換性を保つために、例外を使用できませんでした。エラー状態はエラーコードとともに報告されました。 GDI +には20のエラーコードしかありません。これは、コードのそのような大きなチャンクではそれほど多くありません。

Status :: OutOfMemoryエラーコードは、異なる意味でオーバーロードされました。時々それは本当にメモリ不足を意味し、ビットマップビットを保存するのに十分なスペースを割り当てることができません。悲しいことに、それがどのように起こったのかわからない、画像ファイル形式の問題は同じエラーコードによって報告されます。それをより正確に説明できる専用のエラーコードはないと思います。

1
peter.fr

もう一度開く前に、すべてのファイルが閉じていることを確認してください。まだ開いているファイルの1つである可能性があります。

0
Huy H

Encrypt contents to secure data in file properties-これで問題が解決しました。

enter image description here

0
algiecas