Как загрузить фотографии в фоновом режиме в настольном приложении wpf, чтобы загрузка следующей фотографии в галерее не заняла несколько секунд? - PullRequest
0 голосов
/ 07 ноября 2011

В настоящее время моя программа считывает изображения и текст в записи из файла XML, отображает их на экране, а затем нажатие кнопок «предыдущий / следующий» перемещает к следующей записи. Тем не менее, кажется, что между каждой фотографией требуется несколько секунд, и я бы хотел, чтобы она была мгновенной, как, например, фотоальбом Windows ... или фотографии Facebook (учтите, что это не веб-приложение).

Я искал, нашел несколько похожих ситуаций на мою, но ни одна, казалось, не подходила под мою ситуацию. Я попытался создать класс, основанный на моем поиске, чтобы справиться с фоновой загрузкой и вызвать его в моей программе, но это чревато ошибкой и, вероятно, даже не будет делать то, что я хочу:

//ImageManager.cs

class ImageManager
{
    private Dictionary<string, Image> images = new Dictionary<string, Image>();

    public Image get(string s)
    {  // blocking call, returns the image
        return load(s);
    }

    private Image load(string s)
    {  // internal, thread-safe helper
        lock (images)
        {
            if (!images.ContainsKey(s))
            {
                Image img = images.Add(s, img); //load the image s - ERROR cannot implicitly convert type void to image. Void??
                return img;
            }
            return images[s];
        }
    }

    public void preload(params string[] imgs)
    {  // non-blocking preloading call
        foreach (string img in imgs)
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (s, e) => { load(img); };  // discard the actual image return
            bw.RunWorkerAsync();
        }
    }
}


//MainWindow.cs

ImageManager im = new ImageManager();
im.preload("Data/Images"); // Errors - im is a field but used like a type/token '('

Большое спасибо заранее

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Ваш ImageManager должен работать с ImageSource с, а не Image с. Даже если ваш текущий код заработает, вы обнаружите, что ваш пользовательский интерфейс все еще зависает, потому что у вас нет выбора, кроме как выполнить работу в потоке пользовательского интерфейса. Если вместо этого вы имеете дело с ImageSource s, вы можете загрузить их в фоновом потоке, а затем заморозить их, чтобы использовать их из потока пользовательского интерфейса. Это освобождает вас от преимущественной загрузки изображений или отображения анимации загрузки во время загрузки.

BitmapFrame.Create - это, вероятно, метод, который вы хотите использовать для загрузки изображений.

1 голос
/ 07 ноября 2011

Рассмотрите кэширование уменьшенных изображений - 1: 1 того, что вы хотите показать, или даже меньше.Таким образом, загрузка предварительного просмотра будет намного быстрее, и если пользователь смотрит на изображение достаточно долго, вы можете загрузить полное изображение.

С современными фотографиями исходный размер изображения обычно намного больше, чем обычно отображается.Поэтому, если вы всегда читаете оригинальные изображения, вы тратите большое количество дискового ввода-вывода на то, что никогда не будет показано.

Обычное примечание: это может быть не так в вашей программе.Как и в случае любых проблем с производительностью, чем оптимизировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...