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