我想编写一个函数,它将输入字符串 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;
}
编辑:
有许多可能对社区有帮助的好答案 - 使用懒惰类并使用任务打开它。
不过,我想将 ImageDrawing 放在 DrawingGroup 中,然后序列化,所以懒惰以及任务是不是我的选择。
答案 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事件中执行此操作。