我已经使用了LockBits和UnlockBits函数,并将Image的字节数组转换为1D数组。 (仅考虑黑白/二值化图像)
有没有办法将它带到2D阵列(图像高度和宽度大小)?所以我可以将数组转换成“.txt”文件并查看它?
我用来将图像转换为1D数组的代码如下:
Public void function(Bitmap image){
{
byte[] arr1D;
byte[] arr2D;
BitmapData data = image.LockBits(new Rectangle(0, 0, img_w, img_h), ImageLockMode.ReadOnly, image.PixelFormat);
try
{
IntPtr ptr = data.Scan0;
int bytes = Math.Abs(data.Stride) * image.Height;
byte[] rgbValues = new byte[bytes];
arr1D = rgbValues;
Marshal.Copy(ptr, rgbValues, 0, bytes);
}
finally
{
image.UnlockBits(data);
}
}
由于图像是二进制的,因此Byte数组的值仅为255和0。
有没有任何方法/代码,我可以逐行提取像素到2D数组,而不是将整个图像提取到一维数组,我可以将它写入文本文件,稍后再看?
编程语言: C#
示例:(如果值255替换为1)
结果输出: 1D阵列:(6px X 6px图像)
0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 0
预期输出: 2D阵列:(6px X 6px图像)
0 0 1 1 0 0
0 0 1 1 0 0
1 1 1 1 1 1
1 1 1 1 1 1
0 0 1 1 0 0
0 0 1 1 0 0
有人可以帮我解决一下C#中的代码吗?
答案 0 :(得分:4)
这是一个简单的函数,它接受一个1d的int数组,以及你希望数据分成的每一行的大小,并返回一个二维数组。
public int[,] ConvertArray(int[] Input, int size)
{
int[,] Output = new int[(int)(Input.Length/size),size];
System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\OutFile.txt");
for (int i = 0; i < Input.Length; i += size)
{
for (int j = 0; j < size; j++)
{
Output[(int)(i / size), j] = Input[i + j];
sw.Write(Input[i + j]);
}
sw.WriteLine("");
}
sw.Close();
return Output;
}
我没有添加任何验证来确保输入数组完全可以被大小整除,如果有必要,你需要添加它。
我确实添加了将数据写入文件的代码。
答案 1 :(得分:0)
那很简单。
private int[][] conver1dTo2d(int[] arr, int w, int h){
int[][] answer = new int[h][w];
for(int i = 0 ; i<arr.length; i++){
answer[i/w][i%w] = arr[i];
}
return answer;
}
或
private int[][] conver1dTo2d(int[] arr, int rowSize){
int[][] answer = new int[arr.length/rowsize][rowSize];
for(int i = 0 ; i<arr.length; i++){
answer[i/rowSize][i%rowSize] = arr[i];
}
return answer;
}