Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将图像转换为字节矩阵_C#_Image_Binary Data - Fatal编程技术网

C# 将图像转换为字节矩阵

C# 将图像转换为字节矩阵,c#,image,binary-data,C#,Image,Binary Data,我正在尝试对ImagePNGT进行二进制化,以获得以下结果 为此,我使用了下面的代码,但现在我还没有得到预期的结果 这给了我以下结果要比较两种颜色,请使用ToArgb方法,最好使用StringBuilder,而不是每次连接。 这对我很有用: var img = new Bitmap(pictureBox1.Image); var sb = new StringBuilder(); for (int i = 0; i < img.Height; i++) { for (int j

我正在尝试对ImagePNGT进行二进制化,以获得以下结果

为此,我使用了下面的代码,但现在我还没有得到预期的结果


这给了我以下结果

要比较两种颜色,请使用ToArgb方法,最好使用StringBuilder,而不是每次连接。 这对我很有用:

var img = new Bitmap(pictureBox1.Image);
var sb = new StringBuilder();

for (int i = 0; i < img.Height; i++)
{
    for (int j = 0; j < img.Width; j++)
    {
        if (img.GetPixel(j, i).ToArgb() == Color.White.ToArgb())
        {
            sb.Append("0");
        }
        else
        {
            sb.Append("1");
        }
    }
}

richTextBox1.Text = sb.ToString();

这会产生很多0和一些1,我的图片很大,所以结果很难看,但在你的情况下,它应该可以工作。

你可以这样做,它使用扫描线和锁位,速度相当快

public unsafe static int[,] GetBits(string path )
{
   using (var orig = new Bitmap(path))
   {
      var bounds = new Rectangle(0, 0, orig.Width, orig.Height);    
      // lock the array for direct access
      var bitmapData = orig.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);

      try
      {
         // get the pointer
         var scan0Ptr = (int*)bitmapData.Scan0;    
         // get the stride
         var stride = bitmapData.Stride / 4;    
         // keep the black around
         var black = Color.Black.ToArgb();    
         //Output
         var array = new int[orig.Width, orig.Height];

         // scan all x first then y
         for (var y = 0; y < bounds.Bottom; y++)
            for (var x = 0; x < bounds.Right; x++)                     
               array[x, y] = *(scan0Ptr + x + y * stride) == black ? 0 : 1;

         return array;    
      }
      finally
      {
         // unlock the bitmap
         orig.UnlockBits(bitmapData);
      }    
   }
}
原始图像32x32


不要链接图片,不要以图片的形式发布代码。看起来你的零行比你想要的要长得多。我想如果你在右边的文本框中添加滚动条,你可以向下滚动看到文本的1s部分。您可能只需要将水平和垂直文本条添加到文本区域。
var array = GetBits(@"d:\icon.png");

var w = array.GetLength(0);
var h = array.GetLength(1);

for (int i = 0; i < w; i++)
{
   for (int j = 0; j < h; j++)
      Console.Write(array[i,j]);
   Console.WriteLine();
}
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00011111111111111111111111111000
00011111111111111111111111111000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000000000000000011000
00011000000000011111111111111000
00011000000000011111111111111000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011000000000011000000000011000
00011111111111111111111111111000
00011111111111111111111111111000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000