更快速地将BitmapSource转换为BitmapImage

时间:2014-07-21 11:06:08

标签: wpf performance xaml bitmapimage bitmapsource

我们有一些视频软件可以将BitmapSource转换为BitmapImage,然后使用以下代码将其绘制到屏幕上。问题是在速度较慢的机器上,这个过程看起来有点慢,运行MS分析器后发现这些Bitmap操作(即ToBitmapImage函数)是我们制作的前4个最昂贵的调用。我有什么办法可以提高效率吗?

// Conversion
this.VideoImage = bitmapsource.ToBitmapImage();

// Drawing
drawingContext.DrawImage(this.VideoImage, new Rect(0, 0, imageWidth, imageHeight));

// Conversion code
internal static BitmapImage ToBitmapImage(this BitmapSource bitmapSource)
{
    JpegBitmapEncoder encoder = new JpegBitmapEncoder()
    MemoryStream memorystream = new MemoryStream();
    BitmapImage tmpImage = new BitmapImage();
    encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
    encoder.Save(memorystream);

    tmpImage.BeginInit();
    tmpImage.StreamSource = new MemoryStream(memorystream.ToArray());
    tmpImage.EndInit();

    memorystream.Close();
    return tmpImage;
}

1 个答案:

答案 0 :(得分:3)

根本不需要转换。将VideoImage媒体资源的类型更改为ImageSourceBitmapSource。现在,您将其作为参数直接传递给DrawImage

this.VideoImage = bitmapsource;
drawingContext.DrawImage(this.VideoImage, new Rect(0, 0, imageWidth, imageHeight));