Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Галерея картинок! 
:(
    Опции темы
SultanOFF
Дата 22.11.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Здравствуйте. Есть ли такой компонент с помощью которого можно было бы реализовать галерею картинок? Или кто посоветует как это можно сделать? smile Допустим при запуске сканируется папка 'c:\xxx\' на файлы форматов *.png, *.bmp, *.jpg, *.gif. После получения списка картинок на форме создаются image`sы в количестве равном найденным картинкам и в них соответственно загружаются картинки. Но тогда встает вопрос, можно ли так во время открытия создавать Timage в нужном количестве и загружать в них картинки и как это сделать?
PM MAIL   Вверх
~FoX~
Дата 22.11.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 2
Всего: 68



Цитата(SultanOFF @  22.11.2009,  12:59 Найти цитируемый пост)
Но тогда встает вопрос, можно ли так во время открытия создавать Timage в нужном количестве и загружать в них картинки и как это сделать? 

Да сколько угодно... Тока вот если у тебя в галереи 10000 картинок, то это как то не очень хорошо скажется на производительности... 
Лучше сделать фиксированное количество имеджей и при скроллинге подгружать в них картинки...
Я реализовывал через ListView и прям на его канве при надобности отрисовывал то что надо при помощи GDI+... Получилось быстро, красиво и маштабируемо...


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
SultanOFF
Дата 22.11.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Цитата

Получилось быстро, красиво и маштабируемо...

о вот Мне тоже нужно чтобы масштабировалось! smile 
Цитата

реализовывал через ListView и прям на его канве при надобности отрисовывал то что надо при помощи GDI+.

это как? Можно подробней? или что было бы вовсе прекрасно примером? smile Просто никогда не работал с компонентом ListView... 
PM MAIL   Вверх
~FoX~
Дата 22.11.2009, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 2
Всего: 68



Ну идея такова...
На форму бросаем ImageList и ListView...Связываем их
Дальше ищем файлы и заполняем список путей...
Код

var
  TumbPath: TStringList; //глобальный лист
//--------------------------
procedure GetPathsToTumbs(Dir: string; ras: string);  //Dir - путь к папке, Ras - соответственно расширение формата ('*.jpg')
var
  f : TSearchRec;
  i : integer;
  s : string;
begin
  i := FindFirst(Dir+ras, faAnyFile, f);
  while (i=0) do
    begin
     s := Dir+f.Name;
     TumbPath.Add(s);
     i := FindNext(f);
     Application.ProcessMessages;
    end;
  FindClose(f);
end;


Дальше я создавал пустой список в ЛистеВьюве:
Код

var //глобальная 
  TerminateFlag: boolean; //Если флаг поднят, занчит тормазим все что тормазиться...

//............................
procedure CreateEmptyItem(); //Создаем пустой список
var
  ListItem: TListItem;
  i: integer;
begin
  with Form1 do begin
    for i := 0 to TumbPath.Count -1 do begin
      if TerminateFlag then exit; //Т.к. процесс может быть давольно длительный, при смени фокуса прерываем опирацию....

      Application.ProcessMessages;

      ListItem := ListView1.Items.Add;
      ListItem.Caption := GetDirNameFromPath(TumbPath.Strings[i]); //Здесь просто заполняется капшен итемов именами файлов
      ListItem.ImageIndex := -1; //говорим что картинки пока нету
    end; //for
  end;//with
end;


Дальше немного сложнее, т.к. я писал это все на GDI+
Код

uses GDIPAPI, GDIPOBJ;
//.......................

procedure FillImg();
var
  graphics : TGPGraphics; //основной санвас
  Image, pThumbnail: TGPImage; //полная картинка, и тумблс (минисатюра/эскиз) к ней
  b: TBitmap; //Это мы будем запихивать в имиджлист
  path: string; //путь к файлу
  R: TRect; //область
  x, y, i: integer; //x,y - для размещения по центру
begin
  for i:= 0 to TumbPath.Count-1 do begin
    if TerminateFlag = true then exit;
    Application.ProcessMessages;
    b := TBitmap.Create; 
    b.Width := 130;  //размеры эскизов
    b.Height := 130; 

    graphics := TGPGraphics.Create(b.Canvas.Handle);
    try
      path := TumbPath[i]; //получаем путь из ранее заполненного списка
      Image:= TGPImage.Create(path);

      R := GetProportional(Image.GetWidth, Image.GetHeight, 128, 128); //рассчитываем пропорциональную область 
      pThumbnail := Image.GetThumbnailImage(R.Right, R.Bottom, nil, nil); //получаем миниатюрку

      x := Trunc((130-R.Right)/2);   //определяем координаты левого верхнего угла картинки, 
      y := Trunc((130-R.Bottom)/2); //для размещения по центру

      Graphics.SetSmoothingMode(SmoothingModeHighSpeed); //устанавливаем качество сжатия
      //Graphics.SetCompositingQuality(CompositingQualityHighSpeed);

      Graphics.DrawImage(pThumbnail, x, y, pThumbnail.GetWidth, pThumbnail.GetHeight); //непосредственно рисуем миниатюрку на битмапе

     //это просто рисует прямоугольник во круг картинки
      b.Canvas.LineTo(0,128);
      b.Canvas.LineTo(128,128);
      b.Canvas.LineTo(128,-128);
      b.Canvas.MoveTo(0,0);
      b.Canvas.LineTo(128,0);

     
      Form1.TumbnailsList.Add(b, nil); //добавляем в наш имиджлист полученный маленький битмап
      Form1.ListView1.Items[i].ImageIndex := i; //(*) пробегаем по нашему ListViev-у и устанавливаем картинки для нашего пустого списка  
    finally //не забываем почистица
      Image.Free;
      b.Free;
      pThumbnail.Free;
      graphics.Free;
    end;
  end;
end;

В общем то за счет использования GDI+ код довольно шустро работает даже на нескольких сотнях файлов, к тому же он адекватно переваривает *.bmp, *.dib, *.jpeg/*.jpg, *.emf, *.wmf, *.gif, *.tif/tiff, *.png, *.ico
(*) Вот этот код надо вынести в OnAdvancedCustomDrawItem и подгружать только те картинки которые в данный момент на экране...Откровенно говоря я просто не нашел последний вариант...


З.Ы.: Я не стал выносить код в отдельный поток, ради сохранения производительности. Хотя конечно в потоке это было бы правильней.
З.З.Ы.: Если использовать код как есть, то есть минусы:
- Во время формирования есть артифакты в виде подрагивания
- Приходиться отслеживать смену дирректории в рантайме
Но есть и плюсы:
- После формирования, скроллинг проходит без артифактов
- Есть возможность создавать картинки любого размера

В аттаче скрин с проекта

Это сообщение отредактировал(а) ~FoX~ - 22.11.2009, 21:10

Присоединённый файл ( Кол-во скачиваний: 90 )
Присоединённый файл  ListView.JPG 143,72 Kb


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
SultanOFF
Дата 23.11.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



спасибо большое за столь обширный ответ smile Но в пару местах возникли трудности:
почему пишется что переменная GetDirNameFromPath не обьявленна? А также переменные GetProportional, TumbnailsList? GDI+ подключил...


ПС: не могли бы Вы выложить исходник вашей программы? smile

Это сообщение отредактировал(а) SultanOFF - 23.11.2009, 15:10
PM MAIL   Вверх
~FoX~
Дата 23.11.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 2
Всего: 68



SultanOFF, GetDirNameFromPath функция возвращает имя файла из пути, писал сам потому что нужно было по хитрому это делать, ты используй ExtractFileName...
TumbnailsList - твой ImageList1
А про GetProportional я забыл...
Код

function GetProportional(OldW, OldH, cw, ch: integer): TRect; //получаем пропорцианальный рект
var
  xyaspect: Double; //отношение
begin
  if ((OldW > cw) or (OldH > ch)) then begin
    if ((OldW > 0) and (OldH > 0)) then    begin
      xyaspect := OldW / OldH;
      if OldW > OldH then begin
        OldW := cw;
        OldH := Trunc(cw / xyaspect);
        if OldH > ch then begin
          OldH := ch;
          OldW := Trunc(ch * xyaspect);
        end;
      end
      else begin
        OldH := ch;
        OldW := Trunc(ch * xyaspect);
        if OldW > cw then begin
          OldW := cw;
          OldH := Trunc(cw / xyaspect);
        end;
      end;
    end
    else begin
      OldW := cw;
      OldH := ch;
    end;
  end;

  with Result do begin
    Left := 0;
    Top := 0;
    Right := OldW;
    Bottom := OldH;
  end;
  //OffsetRect(Result, (cw - OldW) div 2, (ch - OldH) div 2);
end;


Цитата

  ПС: не могли бы Вы выложить исходник вашей программы? smile

Боль-мение адекватные исходники давно потеряны, а в том что есть придется пол года разбираться ))))

А, еще забыл..ViewStyle выстави в vsIcon и в ImageList Width и Height в 130

З.Ы.: Если ооочень надо - могу накатать рабочий пример на Д7 или 2k9, но т.к. сильно лениво для начала попробуй сам  smile 

Это сообщение отредактировал(а) ~FoX~ - 23.11.2009, 16:02


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
SultanOFF
Дата 23.11.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



еще раз большая благодарность  smile Вставил все эти функции и процедуры, но теперь никак не пойму как применять данный код? Что получается нужно писать в OnAdvancedCustomDrawItem? И где указать папку с изображениями? Помогите пожалуйста smile
PM MAIL   Вверх
~FoX~
Дата 23.11.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 2
Всего: 68



SultanOFF, Иееех....молодежжж  smile  smile  smile 

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetPathsToTumbs('c:\папка с изображениями\', '*.png');
  GetPathsToTumbs('c:\папка с изображениями\', '*.bmp');
  GetPathsToTumbs('c:\папка с изображениями\', '*.jpg');
  GetPathsToTumbs('c:\папка с изображениями\', '*.jpeg');
  GetPathsToTumbs('c:\папка с изображениями\', '*.gif');
  CreateEmptyItem;
  FillImg;
end;


Это сообщение отредактировал(а) ~FoX~ - 23.11.2009, 17:19


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
SultanOFF
Дата 23.11.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Цитата

Иееех....молодежжж  smile  smile  smile 
 для вас Мои вопросы наверно кажутся такими глупыми smile 

 Кстати  почему то вылетает ошибка указывая на  => TumbPath.Add(s); :(
на скрине сама ошибка




Это сообщение отредактировал(а) SultanOFF - 23.11.2009, 17:37

Присоединённый файл ( Кол-во скачиваний: 66 )
Присоединённый файл  dsfsdf.jpg 14,51 Kb
PM MAIL   Вверх
~FoX~
Дата 23.11.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 2
Всего: 68



Иеееххх....
Ты лист то создай перед использованием....  smile 

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  TumbPath := TStringList.Create;
end;
//...............................................

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TumbPath.Free;
end;


 
Цитата

 для вас Мои вопросы наверно кажутся такими глупыми smile 

Фигня..."Мы все учились понемногу"   smile 

Это сообщение отредактировал(а) ~FoX~ - 24.11.2009, 09:39


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
~FoX~
Дата 24.11.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 2
Всего: 68



Кстати, не забывай очищать лист во время работы

Код

  TerminateFlag := true;
  TumbPath.Clear;
  ImageList1.Clear;
  ListView1.Items.Clear;
  GetPathsToTumbs('c:\папка с изображениями\', '*.png');
  GetPathsToTumbs('c:\папка с изображениями\', '*.bmp');
  GetPathsToTumbs('c:\папка с изображениями\', '*.jpg');
  GetPathsToTumbs('c:\папка с изображениями\', '*.jpeg');
  GetPathsToTumbs('c:\папка с изображениями\', '*.gif');
  TerminateFlag := false;  
  CreateEmptyItem;
  FillImg;


Это сообщение отредактировал(а) ~FoX~ - 24.11.2009, 10:17


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
~FoX~
Дата 24.11.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 2
Всего: 68



Собственно утро, на работе делать не чего....
Вот тебе рабочий пример в аттаче...
Исходники + екзешник, писано на Д7...

Присоединённый файл ( Кол-во скачиваний: 154 )
Присоединённый файл  ThumbNails.rar 212,39 Kb


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
SultanOFF
  Дата 24.11.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Громаднейшее спасибо уважаемый FOX! smile  Все работает просто превосходно, без вас Я бы никак не справился! Выражаю глубокую благодарность  smile 
PM MAIL   Вверх
~FoX~
Дата 24.11.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 2
Всего: 68



SultanOFF, Ну если что обращайся, я много с графикой работал...


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
SultanOFF
Дата 24.11.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



а можешь сказать как сделать чтобы при нажатии на картинку открывался большой скриншот? smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.