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

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

Где найти компонент отображающий Thumbnail ? [D6, WinXP]


leonidus ©   (2007-08-14 17:34:00) 

Нужен быстрый компонент способный отобразить превьюшки фоток, подскажите где такой найти?


deivan   (2008-07-21 13:41:00) [1]

c помощью Мастеров Дефи был создан следующий код:
procedure TForm1.Button3Click(Sender: TObject);
var
 jpeg: TJPEGImage;
 bmp:  TBitmap;
 i: Integer;
begin
 if OpenPictureDialog1.Execute
   then
     begin
     jpeg:=TJPEGImage.Create;
     jpeg.LoadFromFile(OpenPictureDialog1.FileName);
     Image1.Picture.Assign(jpeg);
     TJPEGImage(Image1.Picture.Graphic).Scale :=jsEighth;          
     TJPEGImage(Image1.Picture.Graphic).Performance := jpBestSpeed;
     bmp := TBitmap.Create;
     bmp.width:=120; bmp.height:=90;
     bmp.Canvas.StretchDraw(bmp.Canvas.Cliprect, jpeg );
     with ListView1.Items.Add do begin
       Caption:=OpenPictureDialog1.FileName;
       ImageIndex:=ImageList1.Add(bmp,nil);
     end;
     jpeg.Free;
     bmp.Free;
 end;
end;

открываются файлы жпег и помещаются в листвью, туда же идут превьюшки размером 120х90. Элемент Имаже в коде выше - это картинка на форме, которая курупно показывает только что добавленный в листвью жпег.


s7r   (2007-08-19 16:49:00) [2]

Для установки расстояния между Items в list view нужно послать следующее сообщение:
SendMessage(ShellListView1.Handle, LVM_SETICONSPACING, 0, MAKELONG(X, Y));
где X и Y -соответственно расстояния по горизонтали и вертикали.


> Методом тыка, пришел к удовлетворительному результату и
> при стиле равном vsIcon, но и там засада) превьюшки отображаются
> только в два ряда, даже если окно ListView имеет заведомо
> большую высоту, т.е. в принципе там могло поместиться и
> 3 и 4 ряда, но отображается упорно только 2. С чем это может
> быть связано?


Попробуйте установить в IconOptions Arrangement=iaTop.


leonidus   (2007-08-16 19:41:00) [3]

Методом тыка, пришел к удовлетворительному результату и при стиле равном vsIcon, но и там засада) превьюшки отображаются только в два ряда, даже если окно ListView имеет заведомо большую высоту, т.е. в принципе там могло поместиться и 3 и 4 ряда, но отображается упорно только 2. С чем это может быть связано?


leonidus   (2007-08-15 22:46:00) [4]

Да, теперь заработало, спасибо еще раз.
Но вот есть одна проблема. Самый удобный для меня режим это vsList, т.к. хочется сделать предпросмотр как в ACDSee, но в этом режиме между столбцами получаются большие расстояния, равные ширине превьюшки. Можно ли как-то от этого избавиться?


s7r   (2007-08-15 21:40:00) [5]

FormMain.ImageThumbs.Add(TempBmp, FilePath);
ListView.AddItem(Caption, path);

Да в этих строчках действительно второй параметр может быть nil (В первой в данном случае должен) - это я сам ошибся. Но у меня с соответствующей заменой все работает. В listview нужно еще установить ListView.LargeImages:=ImageThumbs;
ListView.SmallImages:=ImageThumbs;


leonidus   (2007-08-15 16:31:00) [6]

заголовочные файлы подцепил, но компилятор ругается на второй параметр в обеих строчках:

FormMain.ImageThumbs.Add(TempBmp, FilePath);
ListView.AddItem(Caption, path);

помогла замена параметра на nil, но тогда функция на работает. Вызываю ее так:

for i:=1 to 10 do
  AddFile('D:\Pics\'+inttostr(i)+'.bmp',inttostr(i));


leonidus   (2007-08-15 15:22:00) [7]

>S7r большое спасибо за код, но подключить GDIPAPI, GDIPOBJ не удалось, не находит .dcu файлы. Что делать?


s7r   (2007-08-15 11:19:00) [8]

Да и в imagelist нужно установить Height:=100 и Width:=150.


s7r   (2007-08-15 11:16:00) [9]

Вот код процедуры которая добавляет в ImageThumbs (TImageList) миниатюру файла указанного путем FilePath, и связывает ее с элементом ListView. Работает действительно быстро из за Img.GetThumbnailImage. Для работы необходимо подключить к проекту GDIPAPI, GDIPOBJ.(заголовочные файлы для работы с gdi+).
AddFile(const FilePath, Caption: string);
var
 TempBmp: TBitmap;
 gdiGraphics: TGPGraphics;
 Img, Thumb: TGPImage;
 W, H: double;
begin
 TempBmp:=TBitmap.Create;
 TempBmp.Width:=150;
 TempBmp.Height:=100;

 gdiGraphics:=TGPGraphics.Create();
 Img:=TGPImage.Create();

 Img:=Img.FromFile(FilePath);
 Thumb:=Img.GetThumbnailImage(0, 0, nil, nil);
 if(Img.GetWidth()>Img.GetHeight())then
   begin
     H:=TempBmp.Height;
     W:=(H/Img.GetHeight)*Img.GetWidth();
   end
 else
   begin
     H:=TempBmp.Height;
     W:=(H/Img.GetHeight())*Img.GetWidth();
   end;
 gdiGraphics:=gdiGraphics.FromHDC(TempBmp.Canvas.Handle);
 gdiGraphics.DrawImage(Thumb, trunc(TempBmp.Width/2-W/2), 0, W, H);
 FormMain.ImageThumbs.Add(TempBmp, FilePath);
 ListView.AddItem(Caption, path);
 ListView.Items[ListView.Items.Count-1].ImageIndex:=          FormMain.ImageThumbs.Count-1;
 Img.Free;
 Thumb.Free;
 gdiGraphics.Free;
 TempBmp.Free;
end;


leonidus   (2007-08-15 01:58:00) [10]

Делаю связку ImageList и ListView. В ImageList загружаю готовые превьюшки:

var
i:integer;
btm:tbitmap;
begin
for i:=1 to 10 do
 begin
  btm:=tbitmap.Create;
  btm.LoadFromFile('D:\Pics\'+inttostr(i)+'.bmp');
  ImageList1.Add(btm,nil);

  ListView1.Items.Add.Caption:=inttostr(i);
  ListView1.Items.Add.ImageIndex:=i-1;

  btm.Free;
 end;

и они соотв. появляются в ListView, но не получается настроить ViewStyle для того чтобы результат был именно такой как хочется увидеть, то картинки вообще не отображаются, то вместо 10 вижу 20 картинок, черти что. Как же здесь быть?


leonidus   (2007-08-14 22:42:00) [11]

Ну мне нужен именно компонент


Efir   (2007-08-14 18:10:00) [12]

А GDI+?


Наверх

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