如何将一维字节数组转换为具有位图的二维字节数组?

问题描述 投票:2回答:2

我已经使用过LockBits和UnlockBits函数,并将Image的字节数组放入一维数组中。 (仅考虑黑白/二值化图像)

有什么方法可以将其带入2D数组(大小为图像的高度和宽度)?这样我就可以将数组写入“ .txt”文件并进行查看?

我用来将图像放入一维数组的代码如下:

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)

结果输出:一维数组:(6像素X 6像素图像)

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数组:(6像素X 6像素图像)

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#中的代码帮助我吗?

c# arrays image-processing bitmap bytearray
2个回答
4
投票

这是一个简单的函数,它接受一个1d int数组,并将数据拆分成每一行的大小,然后返回一个2d数组。

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;
}

我没有添加任何验证来确保输入数组可以被大小完全整除,如果需要,您需要添加它。

我确实添加了将数据写入文件的代码。


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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.