我正在开发一个项目,使用位图图像逐步显示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像素的解析位图来说似乎有点慢。
我正在寻找一种在整个循环过程结束时消化整个数组的方法(不是在每个单独的循环之后,而是在步骤之间),并且放置有色点(取决于数组的值)相应于i,j(好像它是一个坐标系)。
是否有更快的替代SetPixel,还是有更简单的方法将数组保存到位图/图像文件?
答案 0 :(得分:1)
将您的数组更改为一维数组并在一维数组上应用所有操作,如果您愿意,则仅应用 显示图像将其更改回二维。
如何将整个数组从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
我希望这能解决你的问题!