【C#】画像ファイルを開く

C#で「画像ファイルを開く」というと、画像を表示したり、画像処理をするために、Imageクラス(名前空間:System.Drawing)か、Bitmapクラス(名前空間:System.Drawing)を作成することになります。

BitmapクラスはImageクラスを継承しているので、Imageクラスで出来ることはBitmapクラスでも、ほとんど出来るのですが、違いは何か?というと、Bitmapクラスでは画像データ(画像の輝度値)を参照・設定できる点が大きく異なります。

そのため画像処理を行う場合は、ほぼBitmapクラスを使うことになります。

そこで、画像ファイルからBitmapクラスを生成するメソッドを作成しました。

/// <summary>
/// ファイルを開くダイアログボックスを表示して画像ファイルを開く
/// </summary>
/// <returns>生成したBitmapクラスオブジェクト</returns>
private Bitmap ImageFileOpen()
{
    //ファイルを開くダイアログボックスの作成  
    var ofd = new OpenFileDialog();
    //ファイルフィルタ  
    ofd.Filter = "Image File(*.bmp,*.jpg,*.png,*.tif)|*.bmp;*.jpg;*.png;*.tif|Bitmap(*.bmp)|*.bmp|Jpeg(*.jpg)|*.jpg|PNG(*.png)|*.png";
    //ダイアログの表示 (Cancelボタンがクリックされた場合は何もしない)
    if (ofd.ShowDialog() == DialogResult.Cancel) return null;

    return ImageFileOpen(ofd.FileName);
}

/// <summary>
/// ファイルパスを指定して画像ファイルを開く
/// </summary>
/// <param name="fileName">画像ファイルのファイルパスを指定します。</param>
/// <returns>生成したBitmapクラスオブジェクト</returns>
private Bitmap ImageFileOpen(string fileName)
{
    // 指定したファイルが存在するか?確認
    if (System.IO.File.Exists(fileName) == false) return null;

    // 拡張子の確認
    var ext = System.IO.Path.GetExtension(fileName).ToLower();

    // ファイルの拡張子が対応しているファイルかどうか調べる
    if (
        (ext != ".bmp") &&
        (ext != ".jpg") &&
        (ext != ".png") &&
        (ext != ".tif")
        ) {
        return null;
    }

    Bitmap bmp;

    // ファイルストリームでファイルを開く
    using (var fs = new System.IO.FileStream(
        fileName,
        System.IO.FileMode.Open,
        System.IO.FileAccess.Read))
    {
        bmp = new Bitmap(fs);
    }
    return bmp;
}

このImageFileOpenメソッドの使用例はこんな感じ↓です。

// 画像ファイルを開く
var bmp = ImageFileOpen();
pictureBox1.Image = bmp;

今回はファイルを開くのにFileStreamを使って開いていますが、単に

var bmp = new Bitmap(fileName);

のようにしてもBitmapクラスオブジェクトが生成されるのですが、画像ファイルを使っている間は、指定したファイルをエクスプローラで削除しようとすると

vshost32.exeによってファイルは開かれているため、操作を完了できません。

vshost32.exeによってファイルは開かれているため、操作を完了できません。

というメッセージが出て、ファイルを削除することができなくなるため、FileStreamを用いました。

画像処理のためのC#へ戻る