画像のリストを反復処理し、画像の幅と高さをチェックし、結果に応じて指定されたフォルダーに移動する簡単なプログラムがあります。画像を確認するために使用Image.FromFile(path)
していますが、特定の画像にヒットするとOutOfMemoryException
.
このエラーの潜在的な原因については、ここで既に説明されています
string directory = @"C:\foo\bar\";
foreach (string path in Directory.EnumerateFiles(directory, "*", SearchOption.TopDirectoryOnly)
.Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) || s.EndsWith(".tif", StringComparison.OrdinalIgnoreCase)))
{
//exception thrown here, at Image.FromFile
Image i = Image.FromFile(path);
if (i.Width > i.Height)
{
i.Dispose();
File.Move(path, directory + @"horizontal\" + path.Substring(path.LastIndexOf(@"\") + 1));
}
else
{
i.Dispose();
File.Move(path, directory + @"vertical\" + path.Substring(path.LastIndexOf(@"\")));
}
}
エラーの原因は確かにわかっています。ヒットしている TIFF 画像の一部は (ばかげた理由で!) ビット深度が 40 であり、有効な GDI+ ピクセル形式ではありません。
この問題は try-catch ( OutOfMemoryException
) で回避できますが、他の理由で例外が発生しないことを願うよりも、画像が有効なピクセル形式であることを確認することをお勧めします。