プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

C#で作った画像処理アプリを改良した

こちらの記事で紹介したアプリを改良しました。
s51517765.hatenadiary.jp

この中で「四角い枠を書くときにマウス(MaouseMove)に追従してマウスのボタンを離したときに確定する」というのをやりたかったのですが、うまくできなかったのですがちょうど同じことを実装している例を見つけたのでそのまま採用させていただきました。
effect.hatenablog.com

MouseClick → MouseMove → ? というような形で実装すればできると考えていたのですが、正しくは、MouseDown → MouseMoveとするべきなようです。
MouseClickMouseDown + MouseUp という形になっているようです。

引用元では、MouseUpでリソースの開放(Dispose)を行っていますが、私は保持したままにしています。問題ない気がするけど…。

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(pictureBoxWidth, pictureBoxHeight);
Graphics g;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (!storeCurrentImage()) return;

    startPoint.X = e.Location.X;//配列の0番にクリックした座標を入れる
    startPoint.Y = e.Location.Y;//配列の1番にクリックした座標を入れる
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    //ImageオブジェクトのGraphicsオブジェクトを作成する
    g = Graphics.FromImage(canvas);

    // マウスの左ボタンが押されている場合のみ処理
    if ((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left)
    {
        // 座標を取得
        endPoint.X = e.Location.X;
        endPoint.Y = e.Location.Y;

        int size_x = Math.Abs(startPoint.X - endPoint.X);
        int size_y = Math.Abs(startPoint.Y - endPoint.Y);

        // 先にバックアップしていた画像で塗り潰す
        if (backupImage != null) g.DrawImage(backupImage, 0, 0);

        //Penオブジェクトの作成(幅1の黒色)
        Pen p = new Pen(color, (float)numericUpDownLineWidth.Value);

        g.DrawRectangle(p, Math.Min(startPoint.X, endPoint.X), Math.Min(startPoint.Y, endPoint.Y), size_x, size_y);
        pictureBox1.Image = canvas;
    }
}

github.com

このアプリを使ってみたい方へ

C#のビルド環境があるかたは、Githubから丸ごとダウンロードしてビルドしてください。
C#?ビルド?という方は、GitHubのReleaseフォルダから.exeをダウンロードください。
バグレポート、プルリクエスト、追加機能提案等も歓迎です。