【问题标题】:How to write pixels in WriteableBitmap by bytes from BitmapImage?如何按 BitmapImage 的字节在 WriteableBitmap 中写入像素?
【发布时间】: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


【解决方案1】:

您应该使用 CopyPixels。

MainWindow.xaml

<Grid>
    <Image x:Name="image"></Image>
</Grid>

MainWindow.xaml.cs

    private void Method()
    {
        BitmapImage bi = new BitmapImage(new Uri(@"Image.png", UriKind.Relative));

        int stride = bi.PixelWidth * (bi.Format.BitsPerPixel + 7) / 8;
        byte[] data = new byte[stride * bi.PixelHeight];

        bi.CopyPixels(data, stride, 0);

        WriteableBitmap wb = new WriteableBitmap(
            bi.PixelWidth,
            bi.PixelHeight,
            bi.DpiX, bi.DpiY,
            bi.Format, null);

        wb.WritePixels(
            new Int32Rect(0, 0, bi.PixelWidth, bi.PixelHeight),
            data, stride, 0);

        image.Source = wb; // an Image class instance from XAML.
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多