-
Нужен быстрый компонент способный отобразить превьюшки фоток, подскажите где такой найти?
-
А GDI+?
-
Ну мне нужен именно компонент
-
Делаю связку 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 картинок, черти что. Как же здесь быть?
-
Вот код процедуры которая добавляет в 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;
-
Да и в imagelist нужно установить Height:=100 и Width:=150.
-
>S7r большое спасибо за код, но подключить GDIPAPI, GDIPOBJ не удалось, не находит .dcu файлы. Что делать?
-
заголовочные файлы подцепил, но компилятор ругается на второй параметр в обеих строчках:
FormMain.ImageThumbs.Add(TempBmp, FilePath); ListView.AddItem(Caption, path);
помогла замена параметра на nil, но тогда функция на работает. Вызываю ее так:
for i:=1 to 10 do AddFile('D:\Pics\'+inttostr(i)+'.bmp',inttostr(i));
-
FormMain.ImageThumbs.Add(TempBmp, FilePath); ListView.AddItem(Caption, path);
Да в этих строчках действительно второй параметр может быть nil (В первой в данном случае должен) - это я сам ошибся. Но у меня с соответствующей заменой все работает. В listview нужно еще установить ListView.LargeImages:=ImageThumbs; ListView.SmallImages:=ImageThumbs;
-
Да, теперь заработало, спасибо еще раз. Но вот есть одна проблема. Самый удобный для меня режим это vsList, т.к. хочется сделать предпросмотр как в ACDSee, но в этом режиме между столбцами получаются большие расстояния, равные ширине превьюшки. Можно ли как-то от этого избавиться?
-
Методом тыка, пришел к удовлетворительному результату и при стиле равном vsIcon, но и там засада) превьюшки отображаются только в два ряда, даже если окно ListView имеет заведомо большую высоту, т.е. в принципе там могло поместиться и 3 и 4 ряда, но отображается упорно только 2. С чем это может быть связано?
-
Для установки расстояния между Items в list view нужно послать следующее сообщение: SendMessage(ShellListView1.Handle, LVM_SETICONSPACING, 0, MAKELONG(X, Y)); где X и Y -соответственно расстояния по горизонтали и вертикали.
> Методом тыка, пришел к удовлетворительному результату и > при стиле равном vsIcon, но и там засада) превьюшки отображаются > только в два ряда, даже если окно ListView имеет заведомо > большую высоту, т.е. в принципе там могло поместиться и > 3 и 4 ряда, но отображается упорно только 2. С чем это может > быть связано?
Попробуйте установить в IconOptions Arrangement=iaTop.
-
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. Элемент Имаже в коде выше - это картинка на форме, которая курупно показывает только что добавленный в листвью жпег.
|