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



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

我的问题是:我试图将一个映像保存到MemoryStream,但它继续中断,并抛出消息,"GDI+中发生了一个通用错误。"当我深入挖掘时,我发现当MemoryStream的缓冲区位置在54时抛出了异常。不幸的是,这是一张1.2 mb的照片。这是代码块:

// Create array of MemoryStreams
var imageStreams = new MemoryStream[SelectedImages.Count];
for (int i = 0; i < this.SelectedImages.Count; i++)
{   
    System.Drawing.Image image = BitmapFromSource(this.SelectedImages[i]);
    imageStreams[i] = new MemoryStream();
    image.Save(imageStreams[i], ImageFormat.Bmp); /* Error is thrown here! */
}
// Combine MemoryStreams into a single byte array (Threw this 
// in in case somebody has a better approach)
byte[] bytes = new byte[imageStreams.Sum(s => 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方法。

您正在创建一个流,然后从该流创建位图,然后丢弃该流,然后尝试将位图保存到另一个流。然而,位图类的文档中写道:

必须在位图的生存期内保持流的打开状态。

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

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

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

调用Graphics时请参阅SecurityException。DrawImage导致将位图渲染到ASP中的常见问题。NET输出流

最新更新