Конференция "Media" » Где найти компонент отображающий Thumbnail ? [D6, WinXP]
 
  • leonidus © (14.08.07 17:34) [0]
    Нужен быстрый компонент способный отобразить превьюшки фоток, подскажите где такой найти?
  • Efir © (14.08.07 18:10) [1]
    А GDI+?
  • leonidus © (14.08.07 22:42) [2]
    Ну мне нужен именно компонент
  • leonidus © (15.08.07 01:58) [3]
    Делаю связку 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 картинок, черти что. Как же здесь быть?
  • s7r © (15.08.07 11:16) [4]
    Вот код процедуры которая добавляет в 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;

  • s7r © (15.08.07 11:19) [5]
    Да и в imagelist нужно установить Height:=100 и Width:=150.
  • leonidus © (15.08.07 15:22) [6]
    >S7r большое спасибо за код, но подключить GDIPAPI, GDIPOBJ не удалось, не находит .dcu файлы. Что делать?
  • leonidus © (15.08.07 16:31) [7]
    заголовочные файлы подцепил, но компилятор ругается на второй параметр в обеих строчках:

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

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

    for i:=1 to 10 do
      AddFile('D:\Pics\'+inttostr(i)+'.bmp',inttostr(i));
  • s7r © (15.08.07 21:40) [8]
    FormMain.ImageThumbs.Add(TempBmp, FilePath);
    ListView.AddItem(Caption, path);

    Да в этих строчках действительно второй параметр может быть nil (В первой в данном случае должен) - это я сам ошибся. Но у меня с соответствующей заменой все работает. В listview нужно еще установить ListView.LargeImages:=ImageThumbs;
    ListView.SmallImages:=ImageThumbs;
  • leonidus © (15.08.07 22:46) [9]
    Да, теперь заработало, спасибо еще раз.
    Но вот есть одна проблема. Самый удобный для меня режим это vsList, т.к. хочется сделать предпросмотр как в ACDSee, но в этом режиме между столбцами получаются большие расстояния, равные ширине превьюшки. Можно ли как-то от этого избавиться?
  • leonidus © (16.08.07 19:41) [10]
    Методом тыка, пришел к удовлетворительному результату и при стиле равном vsIcon, но и там засада) превьюшки отображаются только в два ряда, даже если окно ListView имеет заведомо большую высоту, т.е. в принципе там могло поместиться и 3 и 4 ряда, но отображается упорно только 2. С чем это может быть связано?
  • s7r © (19.08.07 16:49) [11]
    Для установки расстояния между Items в list view нужно послать следующее сообщение:
    SendMessage(ShellListView1.Handle, LVM_SETICONSPACING, 0, MAKELONG(X, Y));
    где X и Y -соответственно расстояния по горизонтали и вертикали.


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


    Попробуйте установить в IconOptions Arrangement=iaTop.
  • deivan (21.07.08 13:41) [12]
    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. Элемент Имаже в коде выше - это картинка на форме, которая курупно показывает только что добавленный в листвью жпег.
 
Конференция "Media" » Где найти компонент отображающий Thumbnail ? [D6, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]