【C#】HALCON de 画像処理(マウスで拡大縮小)

スポンサーリンク

今回もユーザー目線の機能を作ろうと考えます。
やりたい内容としては、表示している画像の拡大縮小です。
最終目標としては、【マウスポイントの位置を基準にスクロールで表示している画像の拡大縮小】を目指していました。
前回までで、下記内容を参考にしてください。
  ■マウスポイントの位置の取得方法
  【C#】HALCON de 画像処理(マウスの位置取得) | 育児パパの人生備忘録 (t19488sns.com)
  ■表示してい画像を拡大縮小方法
  【C#】HALCON de 画像処理(表示画像の拡大/縮小) | 育児パパの人生備忘録 (t19488sns.com)
今回は最終目標の『マウスポイントの位置を基準にスクロールで表示している画像の拡大縮小』を説明します。

使用する関数

新規で使う関数は特にありません。
冒頭にある記事で使用した関数で処理を行います。

サンプルアプリケーション作成

下記、記事で作成したサンプルに追加していきます。
【C#】HALCON de 画像処理(マウスの位置取得) | 育児パパの人生備忘録 (t19488sns.com)
今までの組み合わせとSetPart()に設定する数値の算出方法がメインになります。
『左クリックで拡大』『右クリックで縮小』でやってみたいと思います。

操作画面

配置するコントロールに特に変化はありません。
前回と同じで、hWindowControl1にHMouseDownイベントを登録しています。

定義

特に追加する定義はありません。

処理

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

    //マウス座標取得
    hWindowControl1.HalconWindow.GetMposition(out int row, out int column, out int btn);

    //クリック座標表示
    lblClickPoint.Text = $"ClickPoint  X: {column} Y:{row}";

    //倍率が限度内かの確認
    if ((btn == 1 && Math.Round(ValueZoom, 2) <= 0) ||
        (btn == 4 && 4.0 <= Math.Round(ValueZoom, 2))) return;

    //押されたボタンによって、倍率を変更する
    if (btn == 1) ValueZoom -= 0.1;         //拡大
    else if (btn == 4) ValueZoom += 0.1;    //縮小
    else return;                            //終了

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

    //画面表示のサイズを取得
    double w = ImgPart.Right - ImgPart.Left;
    double h = ImgPart.Bottom - ImgPart.Top;
    double rw = (column - ImgPart.Left) / w;
    double rh = (row - ImgPart.Top) / h;

    //表示する画面の大きさ
    double partw = Math.Round(w * ValueZoom, 2);
    double parth = Math.Round(h * ValueZoom, 2);

    SetImagePart tmp = new SetImagePart()
    {
        Left = column - partw * rw,
        Top = row - parth * rh,
        Right = column + partw * (1 - rw),
        Bottom = row + parth * (1 - rh),
    };
    lblCurrentImagePart.Text = 
        $"ImagePart  上: {tmp.Top}  左: {tmp.Left}  下: {tmp.Bottom}  右: {tmp.Right}";

    HOperatorSet.SetPart(hwndOrg, tmp.Top, tmp.Left, tmp.Bottom, tmp.Right);
    HOperatorSet.DispObj(DispOrgImg, hwndOrg);
}

実行結果

右クリックをした所を中心に拡大されます。
左クリックをした所を中心に縮小されます。

考え方(計算式)

読み込み時に表示したImagePartの値を基準に考えます。
例として、20%ズームしたいとします。そして、X3,X4を求めます
そうした時に、表示したいサイズが分かります。
SizeW = Width * 倍率
次にクリックした位置が、元画面のどの位置かを割合で考えます。
RateClick = Column / Width
割合が出ると、表示するサイズから、その割合を考慮します。
distanceW = Size * RateClick
クリックした位置からの距離が出たので、表示したいクリックの位置から左、右は算出できます。
X3 = Xc – distanceW
X4 = Xc – (SizeW – distanceW)

まとめ

クリックした時に何も考えずに拡大すると、クリックした位置を中心に考えて拡大したため、操作がとても面倒でした。
ユーザーのことを考えると、マウスの位置を変えずに拡大・縮小が出来ると使いやすいと考えて作りました。
他のイベントを採用するなら、「HMouseWheel」イベントでマウスのホイールで拡大縮小するのもユーザー目線でいいかもしれません。

コメント

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