Как я могу реализовать отложенную загрузку растровых изображений? - PullRequest
2 голосов
/ 10 января 2012

Я хочу написать функцию, которая получит в качестве входной строки fileName и вернет объект ImageDrawing .
Я не хочу загружать растровое изображение с диска вэта функция.Вместо этого я хочу провести какую-то ленивую оценку.Чтобы узнать размеры, я использую класс Bitmap .

В настоящее время у меня есть этот код:

    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. Есть ли какой-нибудь другой способ, которым я могу реализовать это, чтобы быть полностью ленивым?

Редактировать: Есть много хороших ответов, которые могут быть полезны для сообщества - использовать класс Lazy и открыть его с помощью Task .
Тем не менее, я хочу поместить ImageDrawing в DrawingGroup и сериализовать впоследствии, так что Lazy , а также Task - этоне вариант для меня.

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Конструктор класса 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 голос
/ 10 января 2012

Я предлагаю использовать Timer в вашем классе и загружать ваше изображение «ленивым» образом.Также вы можете попытаться реализовать Задачу MS TPL , чтобы сделать это также внутри события тика Timer.

...