上記のすべての機能にいくつかの問題があることに気づきました。まず第一に - Image.FromFile は指定された画像を開き、その後、何らかの理由で指定された画像ファイルを開こうとすると、ファイルを開くエラーが発生します。アプリケーション自体も - Image.FromStream を使用して切り替えました。
API を切り替えた後 - 例外の種類が OutOfMemoryException から ArgumentException に変更されました。理由は不明です。(おそらく .net フレームワークのバグ?)
また、.net が現在よりも多くの画像ファイル形式のサポートを追加する場合は、関数ごとにチェックします。最初に画像を読み込んで失敗した場合にのみ試して、その後でエラーを報告するのが理にかなっています。
したがって、私のコードは次のようになります。
try {
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
Image im = Image.FromStream(stream);
// Do something with image if needed.
}
}
catch (ArgumentException)
{
if( !IsValidImageFormat(path) )
return SetLastError("File '" + fileName + "' is not a valid image");
throw;
}
どこ:
/// <summary>
/// Check if we have valid Image file format.
/// </summary>
/// <param name="path"></param>
/// <returns>true if it's image file</returns>
public static bool IsValidImageFormat( String path )
{
using ( FileStream fs = File.OpenRead(path) )
{
byte[] header = new byte[10];
fs.Read(header, 0, 10);
foreach ( var pattern in new byte[][] {
Encoding.ASCII.GetBytes("BM"),
Encoding.ASCII.GetBytes("GIF"),
new byte[] { 137, 80, 78, 71 }, // PNG
new byte[] { 73, 73, 42 }, // TIFF
new byte[] { 77, 77, 42 }, // TIFF
new byte[] { 255, 216, 255, 224 }, // jpeg
new byte[] { 255, 216, 255, 225 } // jpeg canon
} )
{
if (pattern.SequenceEqual(header.Take(pattern.Length)))
return true;
}
}
return false;
} //IsValidImageFormat