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

发布一个位图文件与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);
}

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

 转自一个不明英文论坛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值