【C#】画像ファイル(BMP、JPEG、PNG)の破損を確認する方法

破損した画像ファイルをWindows10のフォトアプリで開こうとすると「このファイルはサポートされていない形式のようです」「このファイルを開けません」のようなメッセージが表示されます。

このような画像はC#でも画像オブジェクトとして読み込めません。

この記事では、C#において、明示的に画像の破損を確認する方法を紹介します。

破損画像は開けない

C#で画像データを扱う時、Imageクラスを用いる事が多いと思います。

// Imageクラス(画像検証あり)
var imageFromFile = Image.FromFile(fullPath);

// Imageクラス(画像検証なし)
using (var fileStream = File.Open(fullPath, FileMode.Open))
{
    var imageFromStream = Image.FromStream(fileStream);
}

破損の検証をするメソッドは存在しないので、読み込んだ時の例外をキャッチすることで対応することになります。

画像データが正常に読み込めない場合、

Image.FromFileで画像を読み込んだときはOutOfMemoryException
Image.FromStreamで画像を読み込んだときはArgumentException、OutOfMemoryException

が、それぞれ発生するようなので、その例外を指定してキャッチしてあげれば画像の破損を処理の前に確認できるようになります。

// Imageクラス(画像検証あり)
try
{
    using (var imageFromFile = Image.FromFile(fullPath))
    {
        // 画像を用いた処理
    }
}
catch (OutOfMemoryException ex)
{
    Console.WriteLine(ex.Message);
}

// Imageクラス(画像検証なし)
try
{
    using (var fileStream = File.Open(fullPath, FileMode.Open))
    using (var imageFromStream = Image.FromStream(fileStream))
    {
        // 画像を用いた処理
    }
}
catch (ArgumentException ex)
{
    Console.WriteLine(ex.Message);
}
catch (OutOfMemoryException ex)
{
    Console.WriteLine(ex.Message);
}

ただ、画像データのどこが破損しているのか(ヘッダ?イメージデータ?)はわからないので、詳細までチェックしたい場合は独自でメソッドを作る必要性が出てきます。

いずれにせよ、オブジェクト作成時に例外が発生しないようにする別視点からのアプローチが最も大切です。

コメント

タイトルとURLをコピーしました