【发布时间】:2015-03-25 23:06:40
【问题描述】:
我在使用 BmpBitmapEncoder 将 WriteableBitmap 转换为 BitmapImage 时遇到问题。 这是我的方法:
public BitmapImage ConvertWriteableBitmapToBitmapImage(WriteableBitmap wbm)
{
bmp = new BitmapImage();
using (MemoryStream stream = new MemoryStream())
{
/*PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(wbm));
encoder.Save(stream);*/
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(wbm));
encoder.Save(stream);
bmp.BeginInit();
bmp.UriSource = new Uri(MyImage.Source.ToString());
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache | BitmapCreateOptions.PreservePixelFormat;
bmp.StreamSource = stream;
bmp.EndInit();
bmp.Freeze();
}
return bmp;
}
我正在使用 BmpBitmapEncoder,因为这是在不更改图像 (*.bmp) 大小的情况下保存的唯一方法。我想用更改的像素表和指定的格式像素(Bgr24)保存图像。使用 BmpBitmapEncoder 强制设置 bmp.UriSource ,这是一个问题。 WriteableBitmap 没有这个属性。此外,当我注释行 //bmp.UriSource 向我显示一个异常:bmp.EndInit() 中的“System.ArgumentNullException”。 当我将我的方法更改为:
public BitmapImage ConvertWriteableBitmapToBitmapImage(WriteableBitmap wbm)
{
bmp = new BitmapImage();
using (MemoryStream stream = new MemoryStream())
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(wbm));
encoder.Save(stream);
/*BmpBitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(wbm));
encoder.Save(stream);*/
bmp.BeginInit();
//bmp.UriSource = new Uri(MyImage.Source.ToString());
bmp.CacheOption = BitmapCacheOption.OnLoad;
//bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache | BitmapCreateOptions.PreservePixelFormat;
bmp.StreamSource = stream;
bmp.EndInit();
bmp.Freeze();
}
return bmp;
}
一切正常,但结果是图像增加大小并将像素格式更改为 Bgr32,这不是我所期望的结果。我保存图像的方法很好,因为我在未更改的像素上对其进行了测试,结果很好——图像不会改变格式和大小。请帮我解决这个问题。
【问题讨论】:
标签: c# wpf bitmapimage writeablebitmap