将位图转换为字节数组

将位图转换为字节数组

使用C#,是否有更好的方法来转换WindowsBitmap转到byte[]保存到临时文件并使用FileStream?


holdtom
浏览 351回答 3
3回答

蛊毒传说

A 内存流对此很有帮助。您可以将其放入扩展方法中:public static class ImageExtensions{     public static byte[] ToByteArray(this Image image, ImageFormat format)     {         using(MemoryStream ms = new MemoryStream())         {             image.Save(ms, format);             return ms.ToArray();         }     }}你可以用它就像:var image = new Bitmap(10, 10);// Draw your imagebyte[] arr = image.ToByteArray(ImageFormat.Bmp);在图像转换器方面,我部分地不同意prestuanifto的回答。不要使用图像转换器。从技术上讲,它没有什么问题,但它使用装箱/从对象取消装箱这一事实告诉我,它是来自.NET框架旧的黑暗地方的代码,与图像处理一起使用并不理想(至少在转换为字节[]时是过度的),特别是当您考虑以下情况时。我看了看ImageConverterNET框架使用的代码,在内部它使用的代码几乎与我前面提供的代码相同。它创造了一个新的MemoryStream,保存Bitmap在您提供它时,它的格式是什么,并返回数组。跳过创建ImageConverter类使用MemoryStream

白猪掌柜的

你也可以只是马歇尔.复制位图数据。没有中间内存流等和一个快速的内存副本。这应该同时适用于24位和32位图。public static byte[] BitmapToByteArray(Bitmap bitmap){     BitmapData bmpdata = null;     try     {         bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);         int numbytes = bmpdata.Stride * bitmap.Height;         byte[] bytedata = new byte[numbytes];         IntPtr ptr = bmpdata.Scan0;         Marshal.Copy(ptr, bytedata, 0, numbytes);         return bytedata;     }     finally     {         if (bmpdata != null)             bitmap.UnlockBits(bmpdata);     }}
打开App,查看更多内容
随时随地看视频慕课网APP