3

ビットマップ画像を使用して、2D 世界の生成プロセスを段階的に示すプロジェクトに取り組んでいます。配列データは次のように格納されます。

Main.tile[i, j].type = x;

x は整数値 >= 0 です。

基本的には for ループを使ってプログラムがループするたびに i と j を変更し、ループの最後のループ処理中に特定の条件が満たされた後に次のステートメントを実行します。したがって、可能なシーケンスは次のようになります。

Main.tile[4, 67].type = 1;
Main.tile[4, 68].type = 1;
Main.tile[4, 69].type = 0;

等々。

配列が変更/更新されたら (Bitmap.SetPixel を使用して) ビットマップ イメージを直接変更するいくつかの方法を試しましたが、これは 21k、8k ピクセル解像度のビットマップに役立つには時間がかかるようでした。

ループ プロセス全体の最後に (個々のループの後ではなく、ステップ間で) 配列全体を消化し、それに応じて (配列の値に応じて) 色付きのポイントを配置する方法を探しています。 (あたかも座標系であるかのように)。

SetPixel に代わるより高速な方法はありますか、または配列をビットマップ/画像ファイルに保存する簡単な方法はありますか?

4

1 に答える 1

1

配列を1次元配列に変更し、すべての操作を1次元配列に適用し、画像を表示したい場合にのみ2次元に戻します。

配列全体を 2D から 1D に変更する方法:

byte[,] imageData = new byte[1, 2]
{ 
    {  1,  2 }
    {  3,  4 }
 };

var mergedData = new byte[ImageData.Length];

// Output { 1, 2, 3, 4 }
Buffer.BlockCopy(imageData, 0, mergedData, 0, imageData.Length);

2D から 1D へ:

// depending on whether you read from left to right or top to bottom.
index = x + (y * width)
index = y + (x * height)

1D から 2D へ:

x = index % width
y = index / width or

x = index / height
y = index % height

これで問題が解決することを願っています!

于 2013-09-06T13:10:27.870 に答える