代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

不从内存源渲染WPF图像

  •  0
  • paxdiablo  · 技术社区  · 15 年前

    我的应用程序中有一个数据类,它维护一组表示JPEG图像的字节数组。定义为:

    private ArrayList FrameList = new ArrayList();
    

    byte x[] = { lots of hex values };

    FrameList.Insert(currFrame, x);
    

    然后在上面导入一个JPEG文件:

    byte[] bytes = File.ReadAllBytes(fspec);
    FrameList[currFrame] = bytes;
    

    数组被正确地读入内存并存储在ArrayList中(由调试器确认)。

    但是,我有一个函数来获取图像:

    public BitmapImage getCurrPicture()
    {
        MemoryStream strm;
        BitmapImage bmp = new BitmapImage();
        strm = new MemoryStream((byte[])FrameList[currFrame-1]);
        bmp.CacheOption = BitmapCacheOption.None;
        bmp.BeginInit();
        bmp.StreamSource = strm;
        bmp.EndInit();
        strm.Close();
        return bmp;
    }
    

    imgPicB.Source = data.getCurrPicture();
    

    它并不总是呈现。

    imgPicB 在我的XAML中定义为:

    <Image x:Name="imgPicB"
           Width="400"
           Height="300"
           Stretch="Fill"
           VerticalAlignment="Top" />
    

    有趣的是,如果我使用完全相同的JPEG设置源代码和直接将源代码设置为文件URI,它会呈现良好的效果。

    在WPF中使用内存中的JPEG图像有问题吗?从文件加载时是否执行了一些额外的智能操作(例如自动检测图像类型)?

    2 回复  |  直到 15 年前
        1
  •  3
  •   paxdiablo    15 年前

    试试这个:

    public BitmapSource GetCurrPicture()
    {
        var bitmapImage = new BitmapImage();
        using (Stream stream = new MemoryStream((byte[])FrameList[currFrame-1]))
        {
            bitmapImage.BeginInit();
            bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
            bitmapImage.StreamSource = stream;
            bitmapImage.EndInit();
            bitmapImage.Freeze();
            return bitmapImage;
        }
    }
    

    这是通过让WPF立即用 OnLoad ,然后在完成时释放对流的引用。这意味着流在离开函数时可以被垃圾收集。否则,BitmapImage可能会保留流,直到它被呈现。

    在问题中发布的代码中,呈现将失败,因为:

    • 解码延迟;和
    • 该流已在解码尝试发生的点关闭。
        2
  •  1
  •   rwong    4 年前

    http://blogs.msdn.com/b/dwayneneed/archive/2008/06/20/implementing-a-custom-bitmapsource.aspx

    DwayneNeed 2008年6月20日下午5:11 Comments

    推荐文章