Быстрая загрузка и отображение изображений в картинке - PullRequest
0 голосов
/ 19 октября 2010

Мне нужно загрузить 101 растровое изображение из файловой системы (они не могут быть встроены в приложение в качестве ресурса, так как они будут изменяться при каждом запуске программы) в последовательное окно приложения формы Windows на основе событий таймера короткой продолжительности (500мс дают или беру).

По сути, это должно работать как медленная анимация, но важно, чтобы каждое изображение отображалось.

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

Есть ли способ, которым я могу избежать этого? Предварительная загрузка или создание 101 ящика с картинками, отображение и скрытие?

У кого-нибудь есть предложения?

Ответы [ 5 ]

1 голос
/ 19 октября 2010

Несколько вариантов ... выберите один или объедините их:

(1) Используйте блокировку и счетчик, чтобы гарантировать, что при запуске события загружается следующее изображение в строке.

(2) Отключите таймер в событии Tick, затем снова включите его после загрузки изображения.В результате изображения поступают через 500 мс после прорисовки последнего, поэтому, если загрузка изображения занимает одну секунду, изображения отрисовываются при t = 1000 мс, t = 1500 мс, t = 3000 мс и т. Д. Все изображения отрисовываются,и 500 мс гарантированно проходят между изображениями, но анимация может отображаться медленно.

(3) Выполните вышеописанное, но отследите время начала события, и после того, как изображение нарисовано, установите следующий таймер набыть 500 - (сейчас - eventStart) ... так что если для рисования изображения требуется 250 мс, следующий таймер срабатывает через 250 мс.Если сейчас - eventStart <0, следующий тик таймера должен срабатывать немедленно.Анимация займет минимально возможное количество времени, но изображения могут потенциально мигать, появляясь только в течение нескольких миллисекунд. </p>

(4) Используйте PictureBox.LoadAsync(), чтобы дать вам многопоточность ... следующийСобытие может загружать изображение во время рисования предыдущего события.Но вам понадобится Mutex, который вы выпускаете в событии LoadCompleted, которое вы ждете перед вызовом LoadAsync (), если вам нужно гарантировать, что все изображения прорисованы.

(5) I 'Я не уверен, попадает ли рисунок в категорию «Макет», но вы можете попробовать позвонить SuspendLayout() и ResumeLayout() до / после загрузки изображения

(6) Использовать массив изображений, заблокироватьcounter и используйте свойство .Image PictureBox, чтобы позволить вам предварительно загружать изображения.Я полагаю, что это было предложено в другом ответе, также

HTH,Джеймс

1 голос
/ 19 октября 2010

Что дольше всего?Загрузка изображения или отображение?Вы загружаете каждое изображение, когда оно нуждается в отображении?Просмотр вашего кода был бы очень полезен.

Если вы уверены, что это всегда будет ровно 101 изображение, загрузите их все в массив System.Drawing.Bitmap сначала , затем используйте итераторпеременная, которая увеличивается на каждый вызов Tick события Timer.Пусть это событие Tick загрузит изображение из массива в PictureBox с помощью PictureBox.Image = myBitmapArray[iterator] Если вы увеличите итератор с помощью ++i%=101;, вы не получите ошибку OutOfBounds, и анимация будет зациклена.

1 голос
/ 19 октября 2010

Заполните массив объектов Bitmap перед началом анимации.

0 голосов
/ 19 октября 2010

Еще одна вещь, которая может вызывать беспокойство - это размер изображений. Если все 18-мегапиксельные изображения, я вижу, что это занимает много времени или много места.

Возможно, вы захотите изменить их размер до размера области отображения, когда вы изначально загружаете их, чтобы вы не использовали 2 гигабайта оперативной памяти или не ожидали чтения с диска в зависимости от того, как вы его реализовали.

0 голосов
/ 19 октября 2010

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

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

Если отображение изображений занимает много времени (и даже на моей действительно мощной рабочей станции это не так быстро для больших изображений), тогда возможно ли вам масштабировать изображения до того, как приложение отобразит все? Ваше приложение должно иметь дело с изображениями полного разрешения? В наши дни с мегапиксельными камерами я не могу представить, что вы все равно хотите, чтобы все данные присутствовали в файлах изображений, поскольку размеры могут легко превышать разрешение монитора в 6 раз.

...