Chargement d'images en masse depuis un TImagelist

Résolu
Mr7Bungle Messages postés 17 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 30 octobre 2007 - 17 mars 2006 à 11:50
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 17 mars 2006 à 23:39
Bonjour à tous ,



Je réalise un programme qui scan tout les dossiers d'un repertoire
donné. Chaque dossier contient une image nommée "Folder.jpg" . Ensuite
le programme , au cours du scan, recupere le nom du dossier et le
chemin de l'image contenu dans le dossier sélectionné.



Comme l'image est en Jpeg, je dois passer par une conversion de jpeg
vers bmp pour ensuite la stocker dans une imagelist. Et pour finir ,
pour chaque dossier scanné, je recupere le nom pour lafficher dans un
Tlistview avec en icône l'image stocké à l'index correspondant dans la
TImagelist.





Voici le code :



procedure tform1.refreshdisc;

var

listajout : tlistitem;

jpeg :tjpegimage;

bmp : tbitmap;

img : integer;

rect : trect;

i : integer;

f : textfile;

way,str : string;



begin

listview1.Clear;

jpeg := Tjpegimage.Create;

bmp := Tbitmap.Create;

i := 0;



While i<= shelllistview1.items.Count - 1
do
//quand que non fin du repertoire faire

begin



way :=
shelllistview1.Root+'\'+shelllistview1.folders[i].DisplayName+'\'+'folder.jpg';



//conversionde l'image



jpeg.LoadFromFile(way);

Bmp.Width :=64;

Bmp.Height :=64;

Rect.Left :=0;

Rect.Top :=0;

Rect.Right :=Bmp.Width-1;

Rect.Bottom:=Bmp.Height-1;

Bmp.Canvas.StretchDraw(Rect,Jpeg);



//insertion de l'image dans la Timagelist



image1.Picture.Bitmap.Assign(bmp);


imagelist1.Insert(i,image1.Picture.Bitmap,nil); // cette
ligne ralenti le processus d'affichage





// ajout de l'item dans la Tlistview

listajout := listview1.Items.add;

listajout.Caption := shelllistview1.folders[i].DisplayName;

listajout.imageindex := i;



i := i +1;

end;



Bmp.Free;

Jpeg.Free;

end;





Voila et donc, mon problème est le temps d'affichage de la listview
sachant que 200 à 500 items doivent y etre affiché. c'est trop
long et je cherche donc un moyen d'optimiser l'affichage.



J'ai pensé à une solution qui serait d' éviter de passer par une
Timagelist, mais je ne vois pas comment afficher des icones dans un
Tlistview sans Timagelist





En attente de vos suggestions....merci encore !





MrBungle .

3 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
17 mars 2006 à 23:39
Je pense que l'augmentation de la valeur de la propriété AllocBy du composant TImageList pourrait augmenter les performances :
AllocBy
"Définit le nombre d'images dont s'agrandit la liste d'images quand elle doit faire de la place pour de nouvelles images."

Quand on sait qu'il y aura beaucoup d'images à charger, il vaut mieux éviter d'incessantes réallocations de mémoire.


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 48
17 mars 2006 à 13:24
Salut,
tu te compliques un peut la vie
Dans ce sens tu peux te passer d'un TJpegImage
C'est juste un exemple il faudra l'adapter à tes besoins :

procedure TForm1.Button11Click(Sender: TObject);
Var Bmp, Bmp2 : TBitmap;
begin
Image1.Picture.LoadFromFile('aDemo.jpg'); // on charge le Jpg directement dans un TImage
Bmp := TBitmap.Create; // on crée le Bmp
Bmp.Width := 64; // on ajuste sa taille
Bmp.Height:= 64;
Bmp.Canvas.StretchDraw(Rect(0, 0, 64, 64), Image1.Picture.Graphic); // on le dessine à la bonne taille
ImageList1.Add(Bmp, Nil); // ici on l'ajoute à l'ImageList
Bmp2 := TBitmap.Create; // que pour tester
ImageList1.GetBitmap(0, Bmp2); // que pour tester
Canvas.Draw(0,0, Bmp2); // que pour tester
Bmp2.Free;
Bmp.Free;
end ;


Tu peux aussi récupérer l'index de l'image Comme ceci:
Index : = ImageList1.Add(Bmp, Nil);

Voilà donc si on retire Bmp2 qui n'est la que pour le teste il nous reste que un Bmp et un TImage et bien sur le TImageListe
ceci devrait déjà accélérer l'exécution

@+
Cirec
0
Mr7Bungle Messages postés 17 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 30 octobre 2007
17 mars 2006 à 15:21
Merci beaucoup ! éffectivement je me compliquais un peu la vie !



Résultat des courses donc et bien oui j'ai une execution tout de meme
plus rapide mais encore un peu long tout de même... et c'est le
chargement de l'imagelist qui prend le plus de temps ...n'est il
vraiment pas possible de remplir une listview avec icônes sans passer
par une ImageList?




Dans tout les cas merci à toi Cirec ! ça va bcp mieux deja, mais un peu plus serai le top du top !!



En attentes de suggestions....Merci



MrBungle.
0