簡単な画像処理と読み込み・保存（C#）

学校の課題で画像処理をやることになったので読み込み→処理→保存のテンプレをメモっておく
参照設定でアセンブリ**System.Drawing**を追加する必要がある

```csharp:image.cs
using System;
using System.Drawing;
using System.Drawing.Imaging;
namespace sub_theme
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("path...");
            string inputPath = Console.ReadLine();
            try
            {
                Color[,] pixelData;
                int width, height;
                //追記：元画像のフォーマット
                ImageFormat format;
                //１．指定したパスから画像を読み込む
                using (Bitmap img = new Bitmap(Image.FromFile(inputPath)))
                {
                    //画像サイズを取得
                    width = img.Width;
                    height = img.Height;
                    //追記：元画像のフォーマットを保持
                    format = img.RawFormat;
                    //ピクセルデータを取得
                    pixelData = new Color[img.Width, img.Height];
                    for (int y = 0; y < img.Height; y++)
                    {
                        for (int x = 0; x < img.Width; x++)
                        {
                            pixelData[x, y] = img.GetPixel(x, y);
                        }
                    }
                }
                //２．ピクセルデータに手を加えて新しいピクセルデータを生成
                Color[,] newPixelData = new Color[width,height];
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        Color originalColor = pixelData[x, y];
                        //グレースケール化
                        int brightness = (int)(originalColor.GetBrightness() * 255);
                        Color newColor = Color.FromArgb(originalColor.A, brightness, brightness, brightness);
                        newPixelData[x, y] = newColor;
                    }
                }

                //３．新しいビットマップを生成して保存
                using (Bitmap saveImg = new Bitmap(width,height))
                {
                    //新しいピクセルデータからビットマップを生成
                    for (int y = 0; y < height; y++)
                    {
                        for (int x = 0; x < width; x++)
                        {
                            saveImg.SetPixel(x, y, newPixelData[x, y]);
                        }
                    }
                    //ファイル名が重複しないように
                    string outputPath = inputPath.Insert(inputPath.LastIndexOf('.'), "" + DateTime.Now.Ticks);
                    //追記：元画像のフォーマットで保存する
                    saveImg.Save(outputPath,format);
                    //saveImg.Save(outputPath, ImageFormat.Jpeg);
                }
                Console.WriteLine("success!");
            }
            catch (Exception e)
            {
                Console.WriteLine("error!");
                Console.WriteLine(e.ToString());
            }
        }
    }
}

```

↓元画像
![cat.jpg](https://qiita-image-store.s3.amazonaws.com/0/48041/ad873263-e213-7941-fd75-2754d8ad67a3.jpeg)

↓処理結果（グレースケール）
![cat635474577297446322.jpg](https://qiita-image-store.s3.amazonaws.com/0/48041/be2abcee-ecb6-c1b1-c21c-46c4c58305f6.jpeg)
***
他にもいろいろやってみた結果
↓反転
![cat635474577125034131.jpg](https://qiita-image-store.s3.amazonaws.com/0/48041/3b3f693c-9537-2f22-8727-e420ef39cac2.jpeg)

↓固定閾値法によるモノクロ
![cat635474579085882893.jpg](https://qiita-image-store.s3.amazonaws.com/0/48041/b80002ae-d575-d969-1bce-d19e5be63c3f.jpeg)

思ったより楽しいこれ
もう少し遊びながらアルゴリズムとか勉強する予定

#画像を弄るうえで重要なクラス・構造体
まとめておこう
##[Color構造体](http://msdn.microsoft.com/ja-jp/library/system.drawing.color(v=vs.110).aspx)
色情報を表す。ARGBとHSB両方サポートしている。

* FromArgbメソッド........静的メソッド。ARGB情報を指定してインスタンスを生成する。
* A,R,G,Bプロパティ.......色のARGB情報を取得できる。設定はできない点に注意。

##[Imageクラス](http://msdn.microsoft.com/ja-jp/library/System.Drawing.Image(v=vs.90).aspx)
読み込み・保存の機能を提供している。

* FromFileメソッド...指定したストリーム・パスなどから画像を読み込む
* Saveメソッド.......指定したパスやストリームを使って画像を保存する。ファイル形式の指定には[**ImageFormatクラス**](http://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.imageformat(v=vs.110).aspx)(System.Drawing.Imaging名前空間)を使う。

##[Bitmapクラス](http://msdn.microsoft.com/ja-jp/library/system.drawing.bitmap_members(v=vs.90).aspx)
Imageクラスを継承する。ピクセルデータにアクセスできるようになっている。

* GetPixelメソッド...指定した座標の色情報を返す
* SetPixelメソッド...指定した座標に色情報を設定する