Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите обеспечить быструю подгрузку фотографий в фотогаллерею

266
24 октября 2003 года
mhaturov
901 / / 23.10.2003
Help, немного!
Ситуация следующая. Решил написать свою собственную фотогаллерею. В качестве элемента отображения использовал Image, в который подгружаю фотографии (форматы *.Jpg и *.Bmp).
Получается следующее: на всех страницах, где подгружается по 1 фотке (от 500 Кб до 3 Мб каждая), всё работает очень быстро. Но есть страница с т.н. фотогалереей, в которой я решил предстваить все фотки в миниатюре, чтобы пользователь мог "кликом" выбрать интересующую. Дабы не держать фотки в памяти, решил сделать следующее: рассчитываю, сколько фотографий определённого размера поместится на форме, затем подгружаю на форму массвы Image'й и в них гружу фотки. Если пользователь скроллирует фотографии, то просто в Image'и подгружаются новые картинки, а если, например, пользователь доскроллировал до конца фотки, и на страницу должно вывестись фотографий меньше, чем на ней помещается, лишние Image'и просто скрывются.
Так вот, на этой странице - страшные тормоза! Пробовал грузить фотки в коллекцию, а из неё уже извлекать - начинаются тормоза на этапе заполнения коллекции. Пытался отказаться от динамической подгрузки и формировал массив элементов по числу фоток - память загибается (фотографий больше 150). Плюс, это неприемлемо, так как хочу это дело отправить людям, у которых стоит машина со 166 процом, с 32 Мб оперативки и с ограниченным местом под своп на харде.
Вобщем, если кто знает, как с этим справиться, Help!!! На странице с галереей фотографии иконками заменять не желательно - хочется сделать универсальную прогу, которой просто нужно будет указывать пути к фоткам, музыке и файлам с текстами, а дальше она сама разберётся. По этой же причине использование различных БД нежелательно (хотя, в принципе, фотки можно запихивать в БД на этапе установки программы, а файл БД хранить на харде пользователя, но, повторю, это не желательно).
Извините, если до 27.10.2003 я не прореагирую на Ваше сообщение, так как, возможно, до этого дня просто не смогу выйти в инет.:(
Заранее всем спасибо,
С уважением,
М.Шатуров
267
24 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by mhaturov
Help, немного!
Ситуация следующая. Решил написать свою собственную фотогаллерею. В качестве элемента отображения использовал Image, в который подгружаю фотографии (форматы *.Jpg и *.Bmp).
Получается следующее: на всех страницах, где подгружается по 1 фотке (от 500 Кб до 3 Мб каждая), всё работает очень быстро. Но есть страница с т.н. фотогалереей, в которой я решил предстваить все фотки в миниатюре, чтобы пользователь мог "кликом" выбрать интересующую. Дабы не держать фотки в памяти, решил сделать следующее: рассчитываю, сколько фотографий определённого размера поместится на форме, затем подгружаю на форму массвы Image'й и в них гружу фотки. Если пользователь скроллирует фотографии, то просто в Image'и подгружаются новые картинки, а если, например, пользователь доскроллировал до конца фотки, и на страницу должно вывестись фотографий меньше, чем на ней помещается, лишние Image'и просто скрывются.
Так вот, на этой странице - страшные тормоза! Пробовал грузить фотки в коллекцию, а из неё уже извлекать - начинаются тормоза на этапе заполнения коллекции. Пытался отказаться от динамической подгрузки и формировал массив элементов по числу фоток - память загибается (фотографий больше 150). Плюс, это неприемлемо, так как хочу это дело отправить людям, у которых стоит машина со 166 процом, с 32 Мб оперативки и с ограниченным местом под своп на харде.
Вобщем, если кто знает, как с этим справиться, Help!!! На странице с галереей фотографии иконками заменять не желательно - хочется сделать универсальную прогу, которой просто нужно будет указывать пути к фоткам, музыке и файлам с текстами, а дальше она сама разберётся. По этой же причине использование различных БД нежелательно (хотя, в принципе, фотки можно запихивать в БД на этапе установки программы, а файл БД хранить на харде пользователя, но, повторю, это не желательно).
Извините, если до 27.10.2003 я не прореагирую на Ваше сообщение, так как, возможно, до этого дня просто не смогу выйти в инет.:(
Заранее всем спасибо,
С уважением,
М.Шатуров



То есть ты хочешь сам написать свой ACDSee? А чем не угодил собственно ACDSee?

P.S. Мы тут сами в большинстве своем по выходным не появляемся.

266
24 октября 2003 года
mhaturov
901 / / 23.10.2003
ACDSee, конечно, это хорошо, только не так интересно.:) Хочется самому сделать что-то, что хоть отдалённо напоминает это, да и, к тому же, спортивный интерес - смогу, или нет. да и приятнее показать друзьям-знакомым, да отослать тем же родителям то, чего ни у кого нет, да и быть не может.
258
24 октября 2003 года
SergeySV
1.5K / / 19.03.2003
Чтобы разобраться с твоей проблемой тебе необходимо провести статистический анализ. Необходимо по внутри твоего тормозящего кода навставлять строку измерения системного времени:
Код:
В модуль:
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

В код твоей функции:

Dim lngTime as Long

lngTime =timeGetTime
..........
.. ля-ля..
..........
Debug.Print "Шаг 1:" & timeGetTime -lngTime ' время в миллисек.
lngTime =timeGetTime  
..........
.. ля-ля..
..........
Debug.Print "Шаг 2:" & timeGetTime -lngTime ' время в миллисек.
lngTime =timeGetTime


После этого в окне Debug можно увидеть сколько в миллесек. занимает каждый шаг выполнения программы и определить на каком же этапе происходит главные тормоза. После этого уже можно заняться исправлением ситуации.

Так что сделай и сообщи нам о результатах где и на сколько тормозит, тогда уже будем вместе думать как с оптимизировать.
266
24 октября 2003 года
mhaturov
901 / / 23.10.2003
Когда я только столкнулся с этой проблемой, я замерял время выполнения каждого шага. Насколько помню, самые большие тормоза начинались на LoadPicture в Image, точно так же как на LoadPicture в элемент коллекции (тип Image, или Picture - не помню сейчас). Побайтно, правда, читать картинку из файла не пробовал - возможно, это тоже вариант, хотя, если прикинуть, средний размер картинки 1,44Mb, это, примерно 1509949,44 байт, если я не ошибаюсь, тоесть цикл чтения 1 фотки должен, в среднем, прокрутиться 1509950 раз, да помножить на количество фоток... Если, кстати, в ImageList фотки пихать, происходит Aut of memory просто-напросто.:(
258
24 октября 2003 года
SergeySV
1.5K / / 19.03.2003
А как ты получаешь уменьшенные копии??? грузишь в Image c авторесайзом?
258
24 октября 2003 года
SergeySV
1.5K / / 19.03.2003
У меня мысли такие:
1. С LoadPicture ничего поделать нельзя, ее уже никак не ускоришь.
2. Другое дело, что тот же Acdsee тоже не больно шустро грузит превью, так что главное тут, как говорят проектировщики баз, это кэширование.
Т.е. как токо есть свободное время у проги (можно прям в начале загрузки, по кускам) заняться загрузкой в какой-нибудь скрытый Image, через winAPI:

Private Const IMAGE_BITMAP = 0
Private Const LR_COPYRETURNORG = &H4
Private Const CF_BITMAP = 2
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long, ByVal imageType As Long, ByVal newWidth As Long, ByVal newHeight As Long, ByVal lFlags As Long) As Long

Dim hNew As Long
'create an exact copy of the picture
hNew = CopyImage(Picture1.Picture, IMAGE_BITMAP, xNewSize, yNewSize, LR_COPYRETURNORG)

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

Ну и уже потом, когда понадобится, у тебя уже раз ... и все загружено, сопоставить твой массивчик с Image должно быть очень быстро.
266
25 октября 2003 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by SergeySV
А как ты получаешь уменьшенные копии??? грузишь в Image c авторесайзом?



Да, пытаюсь грузить авторесайзом.

266
25 октября 2003 года
mhaturov
901 / / 23.10.2003
Огромное спасибо за код!:)
Если будет время, попытаюсь внедрить его в эти выходные.
Единственный вопрос, копии иммиджей (уменьшенные фотки) Вы посоветуете держать в памяти, либо сохранить их, как временные, где-нибудь на диске, и оттуда грузить (на мой взгляд, уменьшенные иммиджи должны быстрее подгружаться даже с диска но пока до домашней машины не дорвусь, никак не смогу проверить это.)
Кстати, у меня предложение. Если когда-нибудь допишу свою фотогаллерею, давайте я где-нибудь на ftp выложу исходники, и продолжим её "доточку" вместе. Думаю, у нас может получиться что-нибудть интересное :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог