Wpf MemoryStream抛出System.ObjectDisposedException
我想为iOS调整图像大小,这样我就不必一直手动操作。这应该使用WPF完成,但它会引发ObjectDisposedException 它所做的是用户选择一个csproj文件,然后选择一个将被调整为3个大小的图像。调整大小后,文件应安全地保存到磁盘,但会引发异常 正在检索原始位图图像的字节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)
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()在设置其任何属性之前,即作为using块内的第一条语句。您还可以将GetByteArray的参数类型更改为BitmapSource,这样您就可以将其用于BitmapImage以外的其他BitmapSource派生类型。另外,请注意,有一个类可用于缩放。通过简单地将BeginInt()移到顶部位置,问题就得到了解决。请把它写下来作为一个答案,这样我就可以接受它。异常抛出的确切位置是哪里?您应该调用resizedImage.BeginInit()在设置其任何属性之前,即作为using块内的第一条语句。您还可以将GetByteArray的参数类型更改为BitmapSource,这样您就可以将其用于BitmapImage以外的其他BitmapSource派生类型。另外,请注意,有一个类可用于缩放。通过简单地将BeginInt()移到顶部位置,问题就得到了解决。请把它写下来作为答复,以便我能接受。