C#图像与数组之间的相互转换

一:Bitmap位图转换为byte[]数组

  1:进行以下设置:设置项目管理->属性->生成->允许不安全代码          打√即可

  //unsafe不安全代码,设置允许不安全代码
        private unsafe byte[,] imageToByte(Bitmap bit_Image)
        {
            cols = bit_Image.Width;
            rows = bit_Image.Height;
            BitmapData da = new BitmapData();

            da = bit_Image.LockBits(new Rectangle(0, 0,
                  bit_Image.Width, bit_Image.Height),
                  System.Drawing.Imaging.ImageLockMode.ReadWrite,
                  System.Drawing.Imaging.PixelFormat.Format24bppRgb);//图像格式24位RGB ;
            stride = da.Stride;
            byte* temp = (byte*)da.Scan0.ToPointer();//创建 byte* 指针格式,获取图像首地址 
            byte[,] data = new byte[cols, rows];     //图像列:cols  图像行rows
            //指针是一位一位移动的,因此图像转byte时,从第一行第一个位置开始向右移动,每次移动三个位
            for (int y = 0; y < rows; y++)
            {
                for (int x = 0; x < cols; x++)   //  x是和cols对应,获取一个rgb,x移动三个位
                {
                    data[x, y] = (byte)(temp[0]);
                    temp += 3;                   //指针每次移动三个位
                }
                temp += stride - 3 * cols;       //注意要跳过空白的数据段
            }
            bit_Image.UnlockBits(da);
            return data;
        }

  byte[,] data = new byte[cols, rows]; 可改为byte[] data =new byte[cols*rows];
2:byte数组格式转图像
       private Bitmap bitmap(byte[,] data)
        {

            Bitmap bitdata = new Bitmap(cols, rows); //创建原图大小的空白位图
            for (int y = 0; y < rows; y++)
            {
                for (int x = 0; x < cols; x++)
                {
                    Color c = Color.FromArgb((int)data[x, y],
                        (int)data[x, y],(int)data[x, y]);    //通过位byte数组获取每个像素大小
                    bitdata.SetPixel(x, y, c);            //设置每个像素
                }
            }
            return bitdata;
        }

二:利用文件流将Image图像转为byte[]数组,该方法包含数据头

  private byte[] ImageToByteArray()
        {   
            Image img = Image.FromFile(@"F:\EmguCv\Image\toarray.png");
           
            ImageFormat format = img.RawFormat;    //获取图像原始格式
            using (MemoryStream ms = new MemoryStream()) //创建数据流
            {
                img.Save(ms, format);         //获取图像存入文件流
                byte[] buffer = new byte[ms.Length];
                ms.Seek(0, SeekOrigin.Begin);//指定文件流开头读取数据
                ms.Read(buffer, 0, buffer.Length);//写入byte[]
                return buffer;
            }
        }
 private Image bytetoimg(byte [] buffer)
        {
            MemoryStream ms = new MemoryStream(buffer);
            Image img = Image.FromStream(ms);//从文件流获取图像
            return img;
        }



猜你喜欢

转载自blog.csdn.net/abaqus3_0/article/details/80889233