【发布时间】:2018-11-27 10:01:06
【问题描述】:
我想为 iOS 调整图像大小,这样我就不必一直手动进行。这应该使用 WPF 来完成,但它会引发 ObjectDisposedException。
它的作用是用户选择一个 csproj 文件,然后选择一个图像,该图像将被调整为 3 种尺寸。调整大小后,文件应该被安全保存到磁盘,但它会引发异常。
检索原始 BitmapImage 的字节
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 时,我得到了异常。
提前致谢
【问题讨论】:
-
异常到底是在哪里抛出的?您应该在设置其任何属性之前调用
resizedImage.BeginInit();,即作为 using 块内的第一条语句。您还可以将 GetByteArray 的参数类型更改为 BitmapSource,因此您可以将它与 BitmapImage 之外的其他 BitmapSource 派生类型一起使用。 -
还要注意有一个TransformedBitmap 类,你可以用它来缩放。
-
严重的是,只需将 BeginInt() 移动到顶部位置即可解决问题。请把它写成答案,以便我接受。
标签: wpf memorystream objectdisposedexception