将图像保存到MemoryStream-通用GDI +错误

我的应用程序概述:在客户端,使用网络摄像头拍摄一系列快照。 在提交时,我希望将图像转换为字节数组,并将该字节数组发送到我编写的服务。

我的问题:我正在尝试将单个图像保存到MemoryStream ,但它继续破坏,吐出消息“GDI +中发生了一般错误。” 当我深入挖掘时,我看到当MemoryStream的缓冲区位置为54时抛出exception。不幸的是,它是一张1.2 mb照片。 这是代码块:

 // Create array of MemoryStreams var imageStreams = new MemoryStream[SelectedImages.Count]; for (int i = 0; i  s.Length)]; for(int i = 0; i < imageStreams.Length; i++) { bytes.Concat(imageStreams[i].ToArray()); } 

这是我的BitmapFromSource方法

 // Converts a BitmapSource object to a Bitmap object private System.Drawing.Image BitmapFromSource(BitmapSource source) { System.Drawing.Image bitmap; using (MemoryStream ms = new MemoryStream()) { BitmapEncoder encoder = new BmpBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(source)); encoder.Save(ms); bitmap = new System.Drawing.Bitmap(ms); } return bitmap; } 

我读到的很多关于Generic GDI + Error的内容都指向了权限问题,但是我没有看到这将如何应用,因为我没有保存到文件系统。 此外,我已经看到由于MemoryStream在保存图像之前关闭会出现此错误,但考虑到我在保存图像之前立即创建MemoryStream,我也看不出这是怎么回事。 任何见解将不胜感激。

我认为您的问题实际上在于您的BitmapFromSource方法。

您正在创建一个流,然后从该流创建一个位图,然后抛弃该流,然后尝试将位图保存到另一个流。 但是,Bitmap类的文档说:

您必须在Bitmap的生命周期内保持流打开。

当您保存该位图时,位图已经损坏,因为您已经抛弃了原始流。

请参阅: http : //msdn.microsoft.com/en-us/library/z7ha67kw

要解决这个问题(请记住我没有编写代码,更不用说测试它了),在第一个代码块中的第一个for循环内创建MemoryStream,并将该内存流作为第二个参数传递给BitmapFromSource方法。

调用Graphics.DrawImage时请查看SecurityException,这会导致将位图呈现到ASP.NET OutputStream中的常见问题