C# 如何在c中复制位图图像#

C# 如何在c中复制位图图像#,c#,image,memorystream,bitmapimage,C#,Image,Memorystream,Bitmapimage,我在从memorystream保存图像时遇到一些问题 这是我的密码: MemoryStream ms = new MemoryStream(onimg); if (ms.Length > 0) { Bitmap bm = new Bitmap(ms); returnImage = (Image)bm.Clone(); } ms.Close(); returnImage.Save(@"C:\img.jpeg"); 在returnImage.Save上,我有以下异常: GD

我在从memorystream保存图像时遇到一些问题

这是我的密码:

MemoryStream ms = new MemoryStream(onimg);

if (ms.Length > 0)
{
    Bitmap bm = new Bitmap(ms);
    returnImage = (Image)bm.Clone();
}
ms.Close();
returnImage.Save(@"C:\img.jpeg");
returnImage.Save上,我有以下异常:

GDI+中发生一般性错误

如果我不关闭
内存流
一切正常,但一段时间后需要大量内存

我该怎么做

编辑:该保存只是演示。。我确实需要returnImage,以便在需要将其转换为System.Windows.Media.Imaging.BitmapImage()时将其放置在ObservableCollection中并显示在窗口中

当我这样做的时候

<DataTemplate>
   <Image Width="32" Height="32" Source="{ Binding Thumb, Converter={StaticResource    imageConverter} }" />
</DataTemplate>

磁盘保存基本上不是克隆吗

using (MemoryStream ms = new MemoryStream(onimg))
{
    if (ms.Length > 0)
    {
        using (Bitmap bm = new Bitmap(ms))
        {
            bm.Save(@"C:\img.jpeg");
        }
    }
}
根据:

您必须在位图的生存期内保持流打开

位图需要将其数据存储在相同的位置,我推断(尽管没有证据)位图不会复制数据,而是使用流,对其进行锁定

此外,没有证据表明,
Clone
将使用字节表示的副本创建新位图。您的测试用例表明它不是一个用例

因此,我担心您需要在您的图像的生命周期中保持流的开放。它需要内存,如果位图复制了数据,则位图表示仍需要该内存。因此,开放流不会消耗更多内存(如果我之前的推断为真)

如果您真的想克服位图对原始内存流的依赖性,则需要在新的位图上绘制原始位图,而不是像克隆一样。
但这会影响性能,如果保留原始流不是一个好主意,我最好重新分析,只是确保在处理位图时将其关闭。

如果先保存后关闭MemoryStream会发生什么情况?为什么必须使用位图对象?你不能用FileStream保存文件吗?什么是onimg?您不能报告实际的异常消息吗?我以前遇到过这个问题,错误消息只是:“GDI+中发生了一般错误”。在这里查看更多信息:Brissles:returnImage是全局变量,在这个方法结束后,我需要在另一个类中使用它。因此,在使用returnImage之后,我没有任何机会关闭Memorystream。是的,但我相信“GDI+中发生的一般错误”是位图的一个问题(可能是一些人所说的错误)。Save()我不认为这是一个错误。看看我的答案。
using (MemoryStream ms = new MemoryStream(onimg))
{
    if (ms.Length > 0)
    {
        using (Bitmap bm = new Bitmap(ms))
        {
            bm.Save(@"C:\img.jpeg");
        }
    }
}