C#でラスタ画像を描いてみた

C#で画像処理の練習として、ラスタ画像(ビットマップイメージ)を描いてみました。 試した環境は下記です。

  • Visual Studio 2015 Express for Windows Desktop

目次

  1. 処理の流れ
    1. System.Drawing.dllへの参照の追加
    2. Bitmapクラス
    3. Bitmap.SetPixel()メソッド
    4. Bitmap.Save()メソッド
    5. Color構造体
    6. Color.FromArgb()メソッド
  2. 試してみた
    1. 何を作るか
    2. コード
    3. 動かしてみた

処理の流れ

WPFでラスタ画像を扱うときにこの方法が適切かどうかわからないのですが、System.Drawing名前空間を使ってみます。これが独学のつらいところですね。

  1. Bitmapクラスのインスタンスを作る。

  2. Color構造体のオブジェクトを作って、それに色の情報を設定する。

  3. Bitmap.SetPixel()メソッドで、Bitmapクラスのインスタンスの画素毎に色情報を設定する。

System.Drawing.dllへの参照の追加

System.Drawing名前空間を使用するには、System.Drawing.dllへの参照の追加が必要です。 ソリューションエクスプローラーの参照を右クリックして「参照の追加」を選びます。 160217-1-01 ダイアログが開いたら、「アセンブリ」→「フレームワーク」と選択して、System.Drawingにチェックマークを付けて、「OK」をクリックします。チェックマークを付けるのを忘れないでください。 160217-1-02 参照を追加すると、usingで名前空間を追加できたり、BitmapクラスやColor構造体が使えるようになります。

Bitmapクラス

Bitmapクラスはラスタ画像用の処理をするクラスです。画像の大きさを指定して空のインスタンスを作ったり、ファイルやストリームからインスタンスを作ることができます。 今回使うコンストラクターは下記です。

Bitmap bitmap = new Bitmap(width, height);

引数

内容

width

Int32

ビットマップ画像の幅方向の画素数

height

Int32

ビットマップ画像の高さ方向の画素数

Bitmap.SetPixel()メソッド

Bitmap.SetPixel()メソッドは、Bitmapクラスのインスタンスの画素(ピクセル)の色を指定するメソッドです。

Bitmap.SetPixel(x, y, color)

引数

内容

x

Int32

設定する画素のX座標

y

Int32

設定する画素のY座標

color

Color構造体

設定する画素の色情報

戻り値はありません。 ビットマップ画像のXY座標は、左上端の画素が(X,Y)=(0,0)になります。

Bitmap.Save()メソッド

Image.Save(filename, format)メソッドからの継承です。画像をファイルやストリームに保存するメソッドです。 保存方法に依って何種類かの引数のパターンがあるのですが、今回はファイルに保存するために下記を使用します。

Bitmap.Save(filename, format)

引数

内容

filename

string

保存先のファイル名。

format

ImageFormatクラスのプロパティ

ファイルフォーマット。

戻り値はありません。保存先にすでにファイルが存在する場合は、上書きされます。

Color構造体

Color構造体は、ARGBの色情報を表す構造体です。

Color.FromArgb()メソッド

Color.FromArgb(alpha, red, green, brue)メソッドは、色の具体的な情報からColor構造体を作るメソッドです。引数の指定の仕方によってARGBの32bit値や既存のColor構造体から新しいColor構造体を作ったりもできるのですが、今回はARGBのそれぞれの値を指示してColor構造体を作るメソッドを使います。

Color color = Color.FromArgb(alpha, red, green, blue)

引数

内容

alpha

int

0~255。透明度です。0が透明、255が不透明です。

red

int

0~255。赤です。

green

int

0~255。緑です。

blue

int

0~255。青です。

戻り値は、Color構造体です。

試してみた

何を作るか

512x100の大きさで、横方向に黒から白へのグラデーションを描き、それをPNGファイルとして保存します。

コード

コードは下記の様にしました。

using System;
using System.Windows;
using System.Drawing;
using System.Drawing.Imaging;

namespace image_trial2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            int width = 512;
            int height = 100;
            Bitmap bitmap = new Bitmap(width, height);

            for (int x = 0; x < width; x++)
            {
                int value = (int)Math.Floor((double)x / ((double)width / 256));
                System.Drawing.Color color = System.Drawing.Color.FromArgb(255, value, value, value);
                for (int y = 0; y < height; y++)
                {
                    bitmap.SetPixel(x, y, color);
                }
            }

            string filename = @"ファイル名";
            bitmap.Save(filename,ImageFormat.Png);
        }
    }
}

本当はコンソールアプリで十分なのですが、無駄にWPFになってます。ウィンドウで操作するものはありません。 「最初にx=0の列を上から下まで塗って、次にx=1の列を・・・」という感じで、x=511まで1列毎に画素の色を指定してみました。Bitmap(width, height)で方眼紙を作って、Color.FromArgb(alpha, red, green, blue)で塗料を混ぜて、SetPixel(x, y, color)で1マス毎に塗りつぶしていくような感じでしょうか。

動かしてみた

出来上がったPNGファイルは下図です。 160217-1-03 ちゃんとグラデーションになってますね。 高解像度ディスプレイで見ると、とても綺麗です。

公開日

広告