Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2010, 23:05   #11
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

На моем компьютере задержек не видно. Скорее всего проблема в масштабировании, если картинка больше видимой области ее желательно привести к нужному масштабу на стадии загрузки.
x128 вне форума Ответить с цитированием
Старый 09.08.2010, 00:15   #12
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

Попробовал реализовать через PaintBox. Получилось примерно то же самое, т.е. если прорисовывать только видимую часть, то будет тормозить, а можно прорисовать сразу же все картинки (видимые и невидимые), будет грузиться долго (т.е. все лаги в один момент), а потом при прокрутке тормозить не будет.
По сути это то же самое что и с картинками, вот только картинки вот "так" не прогрузить. Но можно было сделать иначе: загонять их на задний план, делать update (она прогрузиться), и тогда уже выставлять Left. Способ немного плохой, ибо если первая видимая картинка будет с альфа каналом, или просто прозрачной, то задний план будет виден и это будет выглядеть некрасиво. В случае с PaintBox'ом такого не будет, но это не та выгода, чтобы переходить на PaintBox, ибо с ним проблем тоже может быть много.

Хотелось бы сделать что-то типа этого:

Загружать картинки в TImage (для каждой картинки отдельная копия)
Выставлять по своим местам
А потом в потоке проверять: Если картинка ещё не прогрузилась, то прогружать.

Это был бы самый лучший исход. Я уверен что где-то есть такая процедура типа кэшировать картинку, или ещё что-то. Возможно на уровне API, может быть кто-нибудь знает. А то этих способов с прорисовкой на канве, вывод на задний план и там прорисовка и т.д. и т.п. испробовал уже очеень много. Хотелось бы какой-нибудь солидный способ.

Цитата:
Сообщение от x128 Посмотреть сообщение
На моем компьютере задержек не видно. Скорее всего проблема в масштабировании, если картинка больше видимой области ее желательно привести к нужному масштабу на стадии загрузки.
Она итак подводиться. Но на уровне объекта Image, а не битмапа. И проблема, всё же думаю не в масштабировании. Конечно если открывать маленькие изображения, то они будут прогружаться так быстро что и не заметить. На моём компе (1,7 Ггц) картинки 1024*768 подвисают меньше чем на пол секунды, на четверть где-то, это очень ужастно смотриться, особенно когда в первый раз мотаешь - тормозит, а во второй всё отлично.
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.

Последний раз редактировалось Stilet; 09.08.2010 в 08:30.
NoName_emaNoN вне форума Ответить с цитированием
Старый 09.08.2010, 07:26   #13
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Цитата:
Она итак подводиться. Но на уровне объекта Image, а не битмапа.
Только масштабирование происходит в момент вывода... На моем п4-2,4 все происходит без задержек с картинками в два раза большего размера. PaintBox использовать в данном случае выгодней и вывод организовать из буферных битмапов с предварительным масштабированием и в отдельном потоке подгружать по мере необходимости. TImage двигать конечно проще, но это не самый оптимальный вариант в плане быстродействия, хотя если заранее подготовить картинки, а не полагаться на встроенные средства масштаба и выравнивания, то и такой способ не будет тормозить.

решил написать пример:
Код:
var
  Images: TStringList;
...
procedure TForm1.LoadAll;
var
  jpg: TJPEGImage;
  bmp: TBitmap;
  i,j,h,w:integer;
  Image: TImage;
  k:double;
begin
  j:=Panel1.ClientWidth;
  for I := 0 to Images.Count - 1 do
  begin
    Image := TImage.Create(Panel1);
    Image.Parent := Panel1;

    jpg:=TJPEGImage.Create;
    jpg.LoadFromFile(Images[i]);
    bmp:=TBitmap.Create;
    bmp.Assign(jpg);

    K:=Panel1.ClientHeight/bmp.Height;
    h:=Panel1.ClientHeight;
    w:=trunc(bmp.Width*k);

    Image.Height:=h;
    Image.Width:=w;

    SetStretchBltMode(Image.Canvas.Handle, HALFTONE);
    StretchBlt(Image.Canvas.Handle, 0,0,w,h, bmp.Canvas.Handle, 0,0,bmp.Width,bmp.Height, SRCCOPY);

    bmp.Destroy;
    jpg.Destroy;

    Image.Left := j;
    inc(j, w);

    Images.Objects[i]:=Image;
  end;
end;

procedure TForm1.MoveImages(n: integer);
var
  i: integer;
begin
  for i := 0 to Images.Count - 1 do
    with Images.Objects[i] as TImage do Left := Left-n;
end;
Добавь в Images пути к файлам, вызови LoadAll и далее в таймере или по кнопке вызывай MoveImages. Тормозить не должно т.к. имиджи все загружены и приведены к нужному масштабу.

Последний раз редактировалось x128; 09.08.2010 в 10:02. Причина: добавил пример
x128 вне форума Ответить с цитированием
Старый 04.09.2010, 14:44   #14
horoshka
Новичок
Джуниор
 
Аватар для horoshka
 
Регистрация: 03.09.2010
Сообщений: 3
По умолчанию Прогрузить Image в память

Проблема такова: у меня Nokia E63, пытался поставить эту программу, она вроде установилась, но в Галерее так и не появился пункт "Редактировать". Может, кто знает, что надо сделать такого, чтобы оно заработало? Или, может, я что не так сделал?
я как кошка, гуляю сама по себе :)
мои любимые flash игры
horoshka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Image одной формы = Image другой формы DimR Microsoft Office Excel 2 21.04.2010 23:08
динамическая память zhenya.ya Помощь студентам 2 24.02.2010 20:58
Память Ghennadiy Общие вопросы Delphi 9 25.08.2009 09:23
Вопрос по Image (скачанная картинка не хочет выводиться в Image) Radnor Мультимедиа в Delphi 2 06.07.2009 02:20
Память процесса BlackOmen Общие вопросы Delphi 3 24.10.2008 20:16