【C#】PictureBoxの画像を色反転するボタンを追加する【ペイントアプリ】

色反転

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ImageEditing
{
    public partial class frmPaintTool : Form
    {
        // 変数
        // ビットマップ画像
        Bitmap _newBitMap; 
        // マウスクリック中のフラグ   
        bool _mouseDrug;             
        // 前のマウスカーソルのX、Y座標   
        int _prevX;
        int _prevY;                             

        public frmPaintTool()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Bitmapオブジェクトを生成する
            _newBitMap = new Bitmap(DrawingPicBox.Width, DrawingPicBox.Height);
            // Bitmap画像の背景を白で塗りつぶす
            Graphics objGrp = Graphics.FromImage(_newBitMap);
            SolidBrush objBrush = new SolidBrush(Color.White);
            objGrp.FillRectangle(objBrush, 0, 0, _newBitMap.Width, _newBitMap.Height);
            objGrp.Dispose();
            objBrush.Dispose();
        }

        private void DrawingPicBox_MouseDown(object sender, MouseEventArgs e)
        {
            // マウスクリック開始判定
            _mouseDrug = true;
            // マウスカーソル位置記憶の初期化
            _prevX = e.Location.X;
            _prevY = e.Location.Y;
        }

        private void DrawingPicBox_MouseUp(object sender, MouseEventArgs e)
        {
            // マウスクリック終了判定
            _mouseDrug = false;
        }

        private void DrawingPicBox_MouseMove(object sender, MouseEventArgs e)
        {
            // マウスクリック中に、BitMapにGraphicsオブジェクトで描画する
            if (_mouseDrug == true)
            {
                // BitMapからGraphicsオブジェクトを生成
                //描画に利用するペンの色、太さを設定
                //指定したペンでマウスの位置に線を引く
                Graphics objGrp = Graphics.FromImage(_newBitMap);     
                Pen objPen = new Pen(Color.Black, 3);
                objGrp.DrawLine(objPen, _prevX, _prevY, e.Location.X, e.Location.Y);
                _prevX = e.Location.X;
                _prevY = e.Location.Y;
                objPen.Dispose();
                objGrp.Dispose();

                // BitMapオブジェクトをPictureBoxに表示する
                DrawingPicBox.Image = _newBitMap;
            }
        }
    }

private void btnReverse_Click(object sender, EventArgs e)
{
    // 「色反転」ボタンが押されたとき
    // ネガティブイメージを作成する
    _newBitMap = (Bitmap)CreateNegativeImage(_newBitMap); 
    DrawingPicBox.Image = _newBitMap;
}

// 色反転の処理
private Image CreateNegativeImage(Image img)
{
    //ネガティブイメージの描画先となるImageオブジェクトを作成する
    Bitmap negaImg = new Bitmap(img.Width, img.Height);
    //negaImgのGraphicsオブジェクトを取得
    Graphics g = Graphics.FromImage(negaImg);
    //ColorMatrixオブジェクトの作成
    ColorMatrix cm = new ColorMatrix();
    cm.Matrix00 = -1;
    cm.Matrix11 = -1;
    cm.Matrix22 = -1;
    cm.Matrix33 = 1;
    cm.Matrix40 = cm.Matrix41 = cm.Matrix42 = cm.Matrix44 = 1;

    //ImageAttributesを使用して色が反転した画像を描画する
    //ImageAttributesオブジェクトを作成する
    ImageAttributes ia = new ImageAttributes();
    //ColorMatrixを設定する
    ia.SetColorMatrix(cm);
    g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia);
    //リソースを解放する
    g.Dispose();
    return negaImg;
}
}

参考にしたサイトです

dobon.net