LoginSignup
40
48

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-27

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

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;
                //1.指定したパスから画像を読み込む
                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);
                        }
                    }
                }
                //2.ピクセルデータに手を加えて新しいピクセルデータを生成
                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;
                    }
                }

                //3.新しいビットマップを生成して保存
                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

↓処理結果(グレースケール)
cat635474577297446322.jpg


他にもいろいろやってみた結果
↓反転
cat635474577125034131.jpg

↓固定閾値法によるモノクロ
cat635474579085882893.jpg

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

画像を弄るうえで重要なクラス・構造体

まとめておこう

Color構造体

色情報を表す。ARGBとHSB両方サポートしている。

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

Imageクラス

読み込み・保存の機能を提供している。

  • FromFileメソッド...指定したストリーム・パスなどから画像を読み込む
  • Saveメソッド.......指定したパスやストリームを使って画像を保存する。ファイル形式の指定にはImageFormatクラス(System.Drawing.Imaging名前空間)を使う。

Bitmapクラス

Imageクラスを継承する。ピクセルデータにアクセスできるようになっている。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
48