「ホワイトノイズを作成する」という目的のQiita記事を発見しました。
やってみたい!
と思ったのもつかの間、これは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」してみたり。
この辺に変化を加えてみても面白いのかも
参考
コチラを参考にしました。 ありがとうございました。
あとがき
ホワイトノイズの画像をC#で作る!でした!
グラフィック系の処理ってなんか難しそうだけど、思ったより簡単に作れちゃうんだなぁと感じました。
まぁこれが簡単な方だからなのかもしれませんが……
むしろ作りたいものを実現するための、設計とか構築とかが大変なのかも。
楽しかったので、他にも何かできたらやりたいなーと思っていますー