lisz-works

プログラミングと興味を貴方に

ホワイトノイズ(砂嵐)画像をC#で作る

【スポンサーリンク】

ホワイトノイズを作る

「ホワイトノイズを作成する」という目的のQiita記事を発見しました。

qiita.com

やってみたい!

と思ったのもつかの間、これはUnity用のコードでした。

なのでC#のWindowsフォームアプリで作ってみました。

フォームを作る

フォームに設置したのはこの通りです。

フォーム

用途 コンポーネント
生成画像の表示 PictureBox
画像の再生成(更新) Button

ソースコード

ソースコードの全容はこんな感じ。

ソースを開く

namespace Noisy
{
    public partial class Form1 : Form
    {
        public readonly int SIZE = 256;
        public readonly int SEED = 1000;
        Random rand = new Random(1000);
        private int count = 0;

        public Form1()
        {
            InitializeComponent();
            this.pic.Image = CreateWhiteNoise();
            timer1.Stop();
        }
        public Bitmap CreateWhiteNoise()
        {
            double[,] noise = new double[SIZE, SIZE];
            Bitmap bmp = new Bitmap(SIZE, SIZE);
            for ( int y = 0; y < SIZE; y++ )
            {
                string msg = "@";
                for ( int x = 0; x < SIZE; x++ )
                {
                    float value = GetFRand();
                    msg += value.ToString() + " ";

                    int v = (int)(value * 100.0);
                    Color color = Color.FromArgb(255, v, v, v);
                    bmp.SetPixel(x, y, color);
                }
            }
            return bmp;
        }

        private float GetFRand()
        {
            return (float)this.rand.NextDouble();
        }

        private void UpdateTextLog(string log, bool isClear = false)
        {
            if ( isClear )
            {
                this.textLog.Text = "";
            }
            this.textLog.Text = log + "\r\n" + this.textLog.Text;
        }

        private void buttonUpdate_Click(object sender, EventArgs e)
        {
            string frand = GetFRand().ToString();
            UpdateTextLog(string.Format("{0:f5}", frand));

            this.pic.Image = CreateWhiteNoise();
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if ( count < 1000 )
            {
                this.pic.Image = CreateWhiteNoise();
                count++;
            }
            else
            {
                timer1.Stop();
                count = 0;
            }
            UpdateTextLog(count.ToString(), true);
        }
    }
}

主要な処理について

主要な処理について説明します。

ホワイトノイズの生成

CreateWhiteNoise()でホワイトノイズのデータを作っています。

public Bitmap CreateWhiteNoise()
{
    double[,] noise = new double[SIZE, SIZE];
    Bitmap bmp = new Bitmap(SIZE, SIZE);
    for ( int y = 0; y < SIZE; y++ )
    {
        string msg = "@";
        for ( int x = 0; x < SIZE; x++ )
        {
            float value = GetFRand();
            msg += value.ToString() + " ";

            int v = (int)(value * 100.0);
            Color color = Color.FromArgb(255, v, v, v);
            bmp.SetPixel(x, y, color);
        }
    }
    return bmp;
}

参考ページで、Unity用に作っていたものを、C#に書き換えました。

乱数の生成

ホワイトノイズ生成処理(CreateWhiteNoise)のうち、乱数を生成する処理がUnityのAPIを使っていました。

なのでGetFRand()という関数を作成することでカバーしました。

Random rand = new Random(1000);

private float GetFRand()
{
    return (float)this.rand.NextDouble();
}

クラス変数で持っておいたRandomを使って、Doubleの乱数を生成。
それをfloatで返しているだけです。

Randomのシード値(コンストラクタ引数)は、適当です。

色の生成

色もUnity用のものだったので、Bitmapクラスに合わせて作り変えました。

Color color = Color.FromArgb(255, v, v, v);

FromArgb()の引数は、「α値, R, G, B」を、0-255で設定します。

なので渡す値は、取得した乱数を100倍したものを使っています。

float value = GetFRand();
int v = (int)(value * 100.0);
Color color = Color.FromArgb(255, v, v, v);

ちなみに任意のvを増減することで、適当な色の画像に変わります。

例えば、どれかの値だけ「+100」してみたり。

色をいじる

この辺に変化を加えてみても面白いのかも

参考

コチラを参考にしました。 ありがとうございました。

qiita.com

so-zou.jp

www.ipentec.com

qiita.com

あとがき

ホワイトノイズの画像をC#で作る!でした!

グラフィック系の処理ってなんか難しそうだけど、思ったより簡単に作れちゃうんだなぁと感じました。

まぁこれが簡単な方だからなのかもしれませんが……

むしろ作りたいものを実現するための、設計とか構築とかが大変なのかも。

楽しかったので、他にも何かできたらやりたいなーと思っていますー