Wpf MemoryStream抛出System.ObjectDisposedException

Wpf MemoryStream抛出System.ObjectDisposedException,wpf,memorystream,objectdisposedexception,Wpf,Memorystream,Objectdisposedexception,我想为iOS调整图像大小,这样我就不必一直手动操作。这应该使用WPF完成,但它会引发ObjectDisposedException 它所做的是用户选择一个csproj文件,然后选择一个将被调整为3个大小的图像。调整大小后,文件应安全地保存到磁盘,但会引发异常 正在检索原始位图图像的字节 byte[] data = original.GetByteArray(); 使用的方法: public static byte[] GetByteArray(this BitmapImage bmi)

我想为iOS调整图像大小,这样我就不必一直手动操作。这应该使用WPF完成,但它会引发ObjectDisposedException

它所做的是用户选择一个csproj文件,然后选择一个将被调整为3个大小的图像。调整大小后,文件应安全地保存到磁盘,但会引发异常

正在检索原始位图图像的字节

byte[] data = original.GetByteArray();
使用的方法:

 public static byte[] GetByteArray(this BitmapImage bmi)
    {
        byte[] data;
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bmi));
        using (Sys.MemoryStream ms = new Sys.MemoryStream())
        {
            encoder.Save(ms);
            data = ms.ToArray();
        }
        return data;
    }
调整大小:

private BitmapImage ResizeImage(byte[] imageData, double dheight, double dwidth)
        {
            int height = (int)dheight;
            int width = (int)dwidth;
            BitmapImage resizedImage = new BitmapImage();

            using (Sys.MemoryStream ms = new Sys.MemoryStream(imageData))
            {
                resizedImage.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
                resizedImage.CacheOption = BitmapCacheOption.OnLoad;
                resizedImage.DecodePixelHeight = height;
                resizedImage.DecodePixelWidth = width;
                resizedImage.BeginInit();  // Needed only so we can call EndInit()
                resizedImage.StreamSource = ms;
                resizedImage.EndInit();// This does the actual loading and resizing
            }
            return resizedImage;
        }
然后保存文件:

public static void Save(this BitmapImage image, string filePath)
        {
            //PngBitmapEncoder encoder = new PngBitmapEncoder();
            //encoder.Frames.Add(BitmapFrame.Create(image));

            //using (var fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
            //{
            //    encoder.Save(fileStream);
            //}
            File.WriteAllBytes(filePath, image.GetByteArray());
        }
我如何使用它:

            var bmi512 = ResizeImage(data, 512, 512);
            var bmi256 = ResizeImage(data, 256, 256);
            var bmi128 = ResizeImage(data, 128, 128);
            bmi512.Save(Sys.Path.Combine(imageFolderPath, String.Format("{0}512{1}", imageName, imageExt)));
            bmi256.Save(Sys.Path.Combine(imageFolderPath, String.Format("{0}256{1}", imageName, imageExt)));
            bmi128.Save(Sys.Path.Combine(imageFolderPath, String.Format("{0}128{1}", imageName, imageExt)));
它用于检索原始文件的字节[],但当它在bmi512中尝试时,会出现异常。


提前感谢

在设置BitmapImage的任何属性之前,您必须先调用
BeginInit

using (var ms = new MemoryStream(imageData))
{
    resizedImage.BeginInit();
    resizedImage.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
    resizedImage.CacheOption = BitmapCacheOption.OnLoad;
    resizedImage.DecodePixelHeight = height;
    resizedImage.DecodePixelWidth = width;
    resizedImage.StreamSource = ms;
    resizedImage.EndInit();
}

在设置BitmapImage的任何属性之前,必须调用
BeginInit

using (var ms = new MemoryStream(imageData))
{
    resizedImage.BeginInit();
    resizedImage.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
    resizedImage.CacheOption = BitmapCacheOption.OnLoad;
    resizedImage.DecodePixelHeight = height;
    resizedImage.DecodePixelWidth = width;
    resizedImage.StreamSource = ms;
    resizedImage.EndInit();
}

异常具体在哪里抛出?您应该调用
resizedImage.BeginInit()resizedImage.BeginInit()