【问题标题】:How to convert 1D byte array to 2D byte array which holds a bitmap?如何将一维字节数组转换为包含位图的二维字节数组?
【发布时间】:2013-06-30 05:37:35
【问题描述】:

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

有没有办法把它变成一个二维数组(大小图像高度和宽度)?所以我可以将数组写入“.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。

除了将整个图像提取到一维数组之外,是否有任何方法/代码可以将像素逐行提取到二维数组中,我可以将其写入文本文件并稍后查看?

编程语言:C#

示例:(如果将值 255 替换为 1)

结果输出: 一维数组:(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 

预期输出: 二维数组:(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# 代码吗?

【问题讨论】:

  • 可以将一维数组写入N维文件;这只是查看它们的问题。在第一行写入 W 个条目,然后添加一个换行符,然后在下一行写入 W 个条目,依此类推,直到写入 H 行。写入条目的总数为 W*H(或一维数组的大小)。
  • @user2246674 : 请问您能帮我输入代码 sn-p 吗?

标签: c# arrays image-processing bitmap bytearray


【解决方案1】:

这是一个简单的函数,它接受一个 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;
}

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

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

【讨论】:

    【解决方案2】:

    这很简单。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-06
      • 2015-08-23
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多