【C#】HALCON de 画像処理(画像保存)

スポンサーリンク

今回は画像を保存しようと思います。
画像処理の過程の画像を残したい時があります。
そんな時にどうするか考えたら、画像を保存する方法が一番手っ取り早いかなと思いました。

今回使用する関数

画像保存する関数[WriteImage()]です。

HOperatorSet.WriteImage(HObject, HTuple, HTuple, HTuple)

引数の紹介です。

第1引数:[入力]保存したい画像データ
第2引数:拡張子
第3引数:画像のエリア外の色指定(Def:0)
第4引数:パス(拡張子を除く)

サンプルを作ってみる

今回は読み込んだ画像を読み込んだフォルダ内に別名で保存するサンプルを作ろうと思います。

操作画面

簡単にコントロールの説明

btnReadImg   :選択された画像を読み込み+hWindowControl1に表示
lblReadDir   :選択された画像が入っているフォルダパス
hWindowControl1 :選択された画像を表示
btnSave     :画像を保存する。
         保存するフォルダはlblReadDirのテキスト。
         保存するファイル名はtxtFileNameとする
txtFileName   :保存するファイル名

定義

namespaceの定義から

using HalconDotNet;

そして、フォーム内で使用する変数を定義

HObject DispOrgImg = null;      //読み込んだ画像
const double DEF_W = 640.0;
const double DEF_H = 480.0;

処理

btnSaveの処理を紹介します。(他の処理は補足で)

private void btnSave_Click(object sender, EventArgs e)
{
    if (DispOrgImg == null) return;    //読み込んでいるかどうか

    string extension = "png";
    string fp = lblReadDir.Text + "\\" + txtFileName.Text;

    //ファイルの有無確認
    if(System.IO.File.Exists(fp+ "." + extension) == true)
    {
        MessageBox.Show("ファイルが既に存在しています");
        return;
    }

    //画像保存
    HOperatorSet.WriteImage(DispOrgImg, extension, 0, fp);
}

実行結果

ちゃんとpngファイルとして保存されました。他にも拡張子があるので、好きな拡張子を指定しましょう。

まとめ

今回は、画像保存を紹介しました。
なにかと使う機会が多いと思います。
使っていけば、関数名は覚えるので覚えるまで経験を積みましょう。
(自分に言い聞かせる・・・)

補足

ユーザーにファイル指定してもらう関数

private DialogResult SelectImageFile(out string fp)
{
    fp = "";
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.FileName = "";
    ofd.InitialDirectory = @"C:\";
    ofd.Filter = "画像ファイル(*.png;*.jpg)|*.png;*.jpg";
    ofd.Title = "開くファイルを選択してください";

    DialogResult res = ofd.ShowDialog();
    if (res == DialogResult.OK) fp = ofd.FileName;
    return res;
}

画像サイズの比率を変えずに表示枠いっぱいに表示する関数

private void DispZoom(HTuple windowhandle, HObject img)
{
    //Zoom方式で表示
    HOperatorSet.GetImageSize(img, out HTuple w, out HTuple h);

    double rateR = DEF_H / h, rateC = DEF_W / w;
    double rate = (rateR < rateC) ? rateR : rateC;

    double c1 = -((DEF_W / rate) - w) / 2;
    double c2 = c1 + (DEF_W / rate);
    double r1 = -((DEF_H / rate) - h) / 2;
    double r2 = r1 + (DEF_H / rate);
    HOperatorSet.SetPart(windowhandle, r1, c1, r2, c2);
    HOperatorSet.DispObj(img, windowhandle);
}

読込ボタンをクリックされた時の処理

private void btnReadImg_Click(object sender, EventArgs e)
{
    //初期化
    DispOrgImg = null;

    //表示削除
    HTuple hwndOrg = hWindowControl1.HalconWindow;
    HOperatorSet.ClearWindow(hwndOrg);

    //画像を選択してもらう
    if (SelectImageFile(out string fp) == DialogResult.OK)
    {
        //画像読込
        HOperatorSet.ReadImage(out HObject img, fp);
        DispOrgImg = img;

        //Zoom方式で表示
        DispZoom(hwndOrg, img);

        //読み込んだフォルダを表示する
        lblReadDir.Text = System.IO.Path.GetDirectoryName(fp);
    }
}

コメント

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