【发布时间】:2016-08-20 11:54:21
【问题描述】:
目标是存储许多相同大小图像的字节并将它们绘制在 WriteableBitmap 中以创建高性能视频。
我尝试了下一个代码:
public MainWindow()
{
InitializeComponent();
Method();
}
private void Method()
{
BitmapImage bi = new BitmapImage(new Uri(@"Image.png", UriKind.Relative));
int pw = bi.PixelWidth;
int ph = bi.PixelHeight;
WriteableBitmap wb = new WriteableBitmap(
pw,
ph,
96,
96,
PixelFormats.Bgra32,
null);
byte[] data;
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bi));
using (MemoryStream ms = new MemoryStream())
{
encoder.Save(ms);
data = ms.ToArray();
}
int stride = 4 * pw;
wb.Lock();
wb.WritePixels(new Int32Rect(0, 0, pw, ph), data, 4 * pw, 0);
wb.Unlock();
}
错误:
抛出异常:PresentationFramework.dll 中的“System.Windows.Markup.XamlParseException” 附加信息:'对与指定绑定约束匹配的'WpfApplication2.MainWindow'类型的构造函数的调用引发了异常。行号“6”和行位置“9”。 如果有这个异常的处理程序,程序可以安全地继续。
如果我在 UserControl 中放置相同的代码,则会出现下一个错误:
PresentationCore.dll 中出现“System.ArgumentException”类型的未处理异常 附加信息:缓冲区大小不足。
【问题讨论】:
-
您不能将编码的图像缓冲区(此处为 PNG)写入 WriteableBitmap。相反,您必须编写原始像素数据。通过 CopyPixels 从源位图中获取它们。
-
此外,整个方法似乎没有多大意义。当您可以简单地显示源位图时,为什么要将源位图的所有像素复制到目标 WriteabelBitmap 中?
-
@Clemens,我是 WriteableBitmap 的新手,不知道它是如何工作的。我想知道怎么做,即存储不同图像的字节,然后通过 WriteableBitmap 写入它们以创建高性能视频。我需要一个类似于我的代码的工作示例。谢谢,我会试试 CopyPixels。同时,我有一个由缓存的 BitmapImage 实例数组更新的视频。
-
WriteableBitmap的全部意义在于你直接将像素数据写入其中,只需要更新的部分。如果您将整个位图复制到其中,则似乎您已经失败了。
-
@doubleYou,感谢您的澄清,但无论如何,我想检查一下会发生什么。我会检查 CopyPixels。
标签: c# .net wpf .net-4.5 writeablebitmap