Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Слайд-шоу - проблема больших файлов [D7, WinXP]


seregka ©   (2005-03-03 09:59:00) 

Доброго времени суток!

Нужен Ваш совет. Пишу простейший просмотрщик картинок (только *.jpg) то типу АсиДуси (ACDSee).
Основная и единственная задача – слайд-шоу из n-картинок, отображающихся последовательно через 1 секунду в полноэкранном режиме.
Вся проблема в том, что картинки большого разрешения и, соответственно, размера (в среднем, 2032х1524, ~1mb) и когда я пытаюсь организовать слайд-шоу, то получается ерунда. В ACDSee картинки грузятся мгновенно, а у меня медленно и практически не задерживаются на экране, т.к. таймер открывает след.картинку.

Нашел процедуру:
procedure TForm1.FormCreate(Sender: TObject);
begin
 if Image1.Picture.Graphic is TJPEGImage then
 begin
   TJPEGImage(Image1.Picture.Graphic).DIBNeeded;
 end;
end;
, но она совсем не влияет на скорость открытия картинок.

Вот мои процедуры:

procedure TForm1.FormCreate(Sender: TObject);
begin
 if Image1.Picture.Graphic is TJPEGImage then
 begin
   TJPEGImage(Image1.Picture.Graphic).DIBNeeded;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
 if not OpenPictureDialog1.Execute then
   exit;
 with OpenPictureDialog1 do
 begin
for i := 0 to Files.Count - 1 do
     ListBox1.Items.add(Files.Strings[i]);
q:= Files.Count – 1;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.Picture.LoadFromFile(listbox1.Items.strings[k]);
if k=q then
begin
timer1.Enabled:=false;
k:=0;
end;
inc(k);
end;


WondeRu   (2005-03-11 13:45:00) [1]

DeadMeat ©   (11.03.05 13:23) [11]
соглашусь с Вами)


DeadMeat   (2005-03-11 13:23:00) [2]

Попробуй через GDI+ или DX.. Или даже OGL.
Короче привязать к аппаратному ускорению (хотя насчет GDI+ не уверен)..
А загрузку делать (как уже сказали) кэшируемой.. Т.е. по две сразу, а потом каждую следующую...


Cosinus   (2005-03-11 12:12:00) [3]


> WondeRu ©   (11.03.05 08:29) [9]
Ой... Простите. Действительно не в ту эху :)))


WondeRu   (2005-03-11 08:29:00) [4]

Cosinus ©   (10.03.05 10:18) [8]
По скорости.


с чего ты взял??!!!! Речь вообще о другом!!!


Cosinus   (2005-03-10 10:18:00) [5]


> AlterEgo of WondeRu ©   (05.03.05 20:04) [6]
По скорости.


марсианин   (2005-03-07 22:17:00) [6]

ACDSee все-таки кеширует.. правда не все сразу.. а по одной-две загружает заранее и, когда приходит время просмотра, картинка уже загружена..


AlterEgo of WondeRu   (2005-03-05 20:04:00) [7]

Cosinus ©   (05.03.05 17:12) [5]
ScanLine можно использовать. Тогда совсем хорошо будет.


кому хорошо будет?


Cosinus   (2005-03-05 17:12:00) [8]

ScanLine можно использовать. Тогда совсем хорошо будет.


programania   (2005-03-03 18:04:00) [9]

>ACDSee кеширует весь каталог с картинками при открытии

Она кеширует только миниатюры в свою базу
Для полного размера 9mb на картинку никакой памяти не хватит.

Чтоб выводить на экран мгновенно, нужно
ввод и масштабирование делать в bitmap,
а на экран выводить canvas.draw по таймеру,
если загрузка новой закончена, а если нет
а время пришло, можно вывести старую,
перевернув по горизонтали, чтоб создать видимость.
В том же таймере после вывода на экран нужно запускать
загрузку следущей, тогда никаких потоков не надо
и 1 сек вполне хватит для таких файлов,
а если нужно еще быстрее укажите
JPEGImage.Scale:=jsHalfjs или Quarter, jsEighth
для больших картинок, все равно
при такой скорости качество не разглядеть.


WondeRu   (2005-03-03 14:05:00) [10]

нужен не Stream, а TThread!


seregka   (2005-03-03 11:23:00) [11]

Примерчик, можно, пожалуйста. Я просто еще со stream не работал до этого


WondeRu   (2005-03-03 10:49:00) [12]

ACDSee кеширует весь каталог с картинками при открытии! Поэтому советую загружать сразу несколько TJpegImage в одном потоке, а в другом выводить через StretchBlt


Наверх

Титульная страница Поиск, карта сайта Написать письмо