学校の課題で画像処理をやることになったので読み込み→処理→保存のテンプレをメモっておく
参照設定でアセンブリ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());
}
}
}
}
思ったより楽しいこれ
もう少し遊びながらアルゴリズムとか勉強する予定
#画像を弄るうえで重要なクラス・構造体
まとめておこう
##Color構造体
色情報を表す。ARGBとHSB両方サポートしている。
- FromArgbメソッド........静的メソッド。ARGB情報を指定してインスタンスを生成する。
- A,R,G,Bプロパティ.......色のARGB情報を取得できる。設定はできない点に注意。
##Imageクラス
読み込み・保存の機能を提供している。
- FromFileメソッド...指定したストリーム・パスなどから画像を読み込む
- Saveメソッド.......指定したパスやストリームを使って画像を保存する。ファイル形式の指定にはImageFormatクラス(System.Drawing.Imaging名前空間)を使う。
##Bitmapクラス
Imageクラスを継承する。ピクセルデータにアクセスできるようになっている。
- GetPixelメソッド...指定した座標の色情報を返す
- SetPixelメソッド...指定した座標に色情報を設定する