如何实现惰性位图加载?

时间:2012-01-10 15:55:19

标签: c# .net wpf xaml lazy-evaluation

我想编写一个函数,它将输入字符串 fileName 并返回 ImageDrawing 对象。
我不想在此函数中从磁盘加载位图。相反,我想要进行某种懒惰的评估。 为了找出尺寸,我使用位图类。

目前我有这段代码:

    public static ImageDrawing LoadImage(string fileName)
    {
        System.Drawing.Bitmap b = new System.Drawing.Bitmap(fileName);
        System.Drawing.Size s = b.Size ;
        System.Windows.Media.ImageDrawing im = new System.Windows.Media.ImageDrawing();
        im.Rect = new System.Windows.Rect(0, 0, s.Width, s.Height);
        im.ImageSource = new System.Windows.Media.Imaging.BitmapImage(new Uri(fileName, UriKind.Absolute));
        return im;            
    }
  1. System.Drawing.Bitmap 构造函数的调用是否很懒?
  2. 是对 .Size 懒惰的调用吗?
  3. BitmapImage 构造函数是否懒惰?
  4. 还有其他方法可以让它完全懒惰吗?

  5. 编辑: 有许多可能对社区有帮助的好答案 - 使用懒惰类并使用任务打开它。
    不过,我想将 ImageDrawing 放在 DrawingGroup 中,然后序列化,所以懒惰以及任务是不是我的选择。

2 个答案:

答案 0 :(得分:4)

Bitmap类的构造函数不是惰性的,但您可以使用为此目的而创建的Lazy<T>类:

public static Lazy<ImageDrawing> LoadImage(string fileName)
{
    return new Lazy<ImageDrawing>(() => {
        System.Drawing.Bitmap b = new System.Drawing.Bitmap(fileName);
        System.Drawing.Size s = b.Size;
        System.Windows.Media.ImageDrawing im = new System.Windows.Media.ImageDrawing();
        im.Rect = new System.Windows.Rect(0, 0, s.Width, s.Height);
        im.ImageSource = new System.Windows.Media.Imaging.BitmapImage(new Uri(fileName,     UriKind.Absolute));
        return im;
    });
}

从文档(http://msdn.microsoft.com/en-us/library/dd997286.aspx):

  

虽然您可以编写自己的代码来执行延迟初始化,但我们建议您使用Lazy。 Lazy及其相关类型也支持线程安全并提供一致的异常传播策略。

答案 1 :(得分:1)

我建议您在班级中使用Timer,并以“懒惰”的方式下载图片。您也可以尝试实现MS TPL的任务,以便在Timer tick事件中执行此操作。