Converting a bitmap to a byte array 位图文件与Byte[]转换

来源:互联网 发布:ipad软件图标上有锁 编辑:程序博客网 时间:2024/06/05 18:07

发布一个位图文件与Byte流间转换的方法集。

方法1 从内存中直接获取位图的Byte[]

// import this 
// using System.Runtime.InteropServices;
private unsafe byte[] BmpToBytes_Unsafe (Bitmap bmp)
{
    BitmapData bData 
= bmp.LockBits(new Rectangle (new Point(), bmp.Size),
        ImageLockMode.ReadOnly, 
        PixelFormat.Format24bppRgb);
    
// number of bytes in the bitmap
    int byteCount = bData.Stride * bmp.Height;
    
byte[] bmpBytes = new byte[byteCount];

    
// Copy the locked bytes from memory
    Marshal.Copy (bData.Scan0, bmpBytes, 0, byteCount);

    
// don't forget to unlock the bitmap!!
    bmp.UnlockBits (bData);

    
return bmpBytes;
}

还原方法

private unsafe Bitmap BytesToBmp (byte[] bmpBytes, Size imageSize)
{
    Bitmap bmp 
= new Bitmap (imageSize.Width, imageSize.Height);

    BitmapData bData  
= bmp.LockBits (new Rectangle (new Point(), bmp.Size),
        ImageLockMode.WriteOnly,
        PixelFormat.Format24bppRgb);

    
// Copy the bytes to the bitmap object
    Marshal.Copy (bmpBytes, 0, bData.Scan0, bmpBytes.Length);
    bmp.UnlockBits(bData);
    
return bmp;
}

方法2  通过将位图文件写入内存流的方式获取byte[]

// Bitmap bytes have to be created via a direct memory copy of the bitmap
private byte[] BmpToBytes_MemStream (Bitmap bmp)
{
    MemoryStream ms 
= new MemoryStream();
    
// Save to memory using the Jpeg format
    bmp.Save (ms, ImageFormat.Jpeg);
    
    
// read to end
    byte[] bmpBytes = ms.GetBuffer();
    bmp.Dispose();
    ms.Close();

    
return bmpBytes;
}


//Bitmap bytes have to be created using Image.Save()
private Image BytesToImg (byte[] bmpBytes)
{
    MemoryStream ms 
= new MemoryStream(bmpBytes);
    Image img 
= Image.FromStream(ms);
    
// Do NOT close the stream!
    
    
return img;
}

方法3 使用序列化的方式获得位图的byte[]

// import these
// using System.Runtime.Serialization;
// using System.Runtime.Serialization.Formatters.Binary;
private byte[] BmpToBytes_Serialization (Bitmap bmp)
{
    
// stream to save the bitmap to
    MemoryStream ms = new MemoryStream();
    BinaryFormatter bf 
= new BinaryFormatter();
    bf.Serialize (ms, bmp);

    
// read to end
    byte[] bmpBytes = ms.GetBuffer();
    bmp.Dispose();
    ms.Close();

    
return bmpBytes;
}

private Bitmap BytesToBmp_Serialized (byte[] bmpBytes)
{
    BinaryFormatter bf 
= new BinaryFormatter ();
    
// copy the bytes to the memory
    MemoryStream ms = new MemoryStream (bmpBytes);
    
return (Bitmap)bf.Deserialize(ms);
}

 

 方法4  获取位图对象句柄、

private IntPtr getImageHandle (Image img)
{
    FieldInfo fi 
= typeof(Image).GetField("nativeImage", BindingFlags.NonPublic | BindingFlags.Instance);
    
if (fi == null)
        
return IntPtr.Zero;

    
return (IntPtr)fi.GetValue (img);
}

获得句柄后,想怎么操作都可以喽

 转自一个不明英文论坛

原创粉丝点击