Limite nombre d'images en ImageList

yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013 - 4 juil. 2006 à 17:16
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013 - 10 juil. 2006 à 15:39
Bonjour,

J'utilise 1 imageList associée à 1 Treeview et lorsque j'ai plus de 1300 images 16x16 (extraction d'icones), les images deviennent corrompues !
L'imageList est limitée ????
Quelqu'un connait-il 1 astuce ?
Merci

7 réponses

cs_pluplu Messages postés 615 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 4 juillet 2012
4 juil. 2006 à 19:13
Ben bêtement en mettant deux imagelist non ?!
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
4 juil. 2006 à 19:17
Salut
Je crois que la limite d'une imagelist est la RAM disponible. Donc ce n'est pas en nombre d'images mais en taille cumulée de ces images qu'il faut compter.
J'ai vu un code qui chargeait très facilement 1600 images *.jpg dans une imagelist.
Etant donné qu'une icone ne pèse pas grand chose, le problème doit venir d'ailleurs.
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
4 juil. 2006 à 23:20
Merci de vos réponses.
Pluplu, j'y avais bien pensé à utiliser plusieurs imageList, mais comme l'imagelist alimente 1 treeview, ça ne peut pas aller, excepté si on peut associé plusieures imagelist à 1 TV, mais là, je ne sais pas faire.


Effectivement Dolphin Boy, si tu dis avoir vu 1 code qui charge 1600 jpg, avec mes 1000 bmp 16x16 pixels ça devrait passer, donc il y a  problème mais où ?
Je récupère l'icone associé à un fichier en small, 16x16, je le dessine dans 1 picturebox, jusqu'ici rien de compliqué, puis je transfers dans la imagelist par :

imagelist1.ListImages.Add , Extension, picIcon.Image
imagelist1.MaskColor = picIcon.BackColor


où Extension la clé (string) ; picIcon la pictureBox
entre les 2 je fais 1 cls sur ma picturebox avant d'y dessiner mon icone et 1 refresh après.
De toutes façons ça fonctionne pour 1000 icones, alors pourquoi + après ?

Merci de vos idées.
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
5 juil. 2006 à 20:30
Personnellement, pour remplir une imagelist je code :

Dim imgX As ListImage
Set imgX = ImageList1.ListImages.Add(,"MaCle1", _
LoadPicture("MonIcone1.ico"))
Set imgX = ImageList1.ListImages.Add(,"MaCle2", _
LoadPicture("MonIcone2.ico"))

Dans ton cas, tu passes par une picturebox donc tu ne connais pas la taille réelle (en octets) de tes images et ça, c'est selon la définition de ton écran (combien de bits par pixel ?).
Par exemple, pour 8 BPP, ton image pèsera 16x16x1 octet 256 octets, pour 32 BPP -> 16x16x4 octets 1024 octets, pour 64 BPP -> 16x16x8 = 4096 etc... don multiplié même par 2000 images ça devrait passer.

Je n'ai rien vu concernant une limitation en nombre nulle part. Seulement en RAM.

Je vais peut-être dire une bêtise, je n'ai pas testé dans le même cas que le tien, mais, si j'ai bien compris, toutes tes images passent par ta (tes ?) picturebox. Comment les "dessine"-tu ? As-tu essayé de coder un savepicture pour voir la taille d'une de tes images sur le disque après être passées par ton traitement ? Vides-tu ta picturebox après utilisation avec un picIcon.Image = loadpicture() ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
6 juil. 2006 à 00:05
Bonsoir,

Je te remercie Dolphin Boy pour tes explications. Je vais regarder combien pèse mes icones, la plupart doit être en 1024 octets, alors ça devrait passer ....

Par contre, tu m'as fait penser que j'oubliais de décharger la dernière image dans la picturebox par loadpicture(), je vais l'ajouter pour le geste propre, mais je ne crois pas que 1024 o en + vont tellement surchargés la mémoire.
Je me demande s'il n'y aurait pas un truc du côté de l'utilisation de la propriété .MaskColor qui, si j'ai bien compris de la doc lue par ci par là en Anglais, et c'est ça qui coïnce, créerait une 2° image à chaque image pour le masque. Si c'est bien le cas, ça fait forcément monter la conso mémoire !


Sinon je suis obligé de passer par 1 picturebox car j'extrais directement mes icones du système, je ne peux donc pas les charger dans la liste image par un loadPicture, voire un loadResPicture,  en fait mon code est :


 lenSh = Len(Sh)
SHGetFileInfo strPath & strFic, 0, Sh, lenSh, SHGFI_ICON Or SHGFI_SMALLICON
If Sh.hIcon <> 0 Then 
   picIcon.ScaleMode = vbPixels
   picIcon.Cls        'utile pour effacer zones non recouvertes par nv icone
   DrawIconEx picIcon.hdc, 0, 0, Sh.hIcon, 16, 16, 0, 0, DI_NORMAL
   picIcon.Refresh
   ' vide l'icone de la mémoire
   DestroyIcon Sh.hIcon
   imageList1.ListImages.Add , Extension, picIcon.Image
   imageList1.MaskColor = picIcon.BackColor ' pour la transparence du fond
End if
avec bien sûr avant les déclarations API et Type.

L'imageList est associée à 1 TreeView qui est lui aussi chargé de nombreux nodes, au moins autant, or d'après ce que j'ai lu 1 node consomme 40 octets.

Merci.
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
9 juil. 2006 à 16:19
As-tu lu la MSDN concernant la propriété MaskColor ? En voici les remarques :

Remarques

À chaque image d'une collection ListImages est associé un masque correspondant. Celui-ci est une image monochrome dérivée de l'image associée et générée automatiquement en utilisant la propriété MaskColor comme couleur spécifique du masque. Le masque n'est pas utilisé directement mais il est appliqué sur l'image bitmap d'origine au cours d'opérations graphiques telles que les méthodes Overlay et Draw. Par exemple, la propriété MaskColor détermine la couleur de l'image qui sera transparente dans la méthode Overlay.

En cas de modification du système de couleurs, la couleur transparente changera, rendant l'aspect de l'image imprévisible. Il est donc préférable en programmation d'utiliser des couleurs indépendantes du système.

Je n'ai pas eu le temps de faire de test mais il me semble que le 2ème paragraphe décrit ton problème (aspect de l'image imprévisible).
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
10 juil. 2006 à 15:39
Bonjour,

Oui j'avais vu, Dolphin Boy, dans la doc MSDN, l'info sur la 2° image en noir & blanc. Mais comme j'avais regardé 1 info en anglais, je n'avais pas bien saisi le 2° paragraphe. Merci de me l'avoir rapporté. (depuis je l'ai d'ailleurs retrouvé en Français !)
J'ai supprimé l'utilisation de la propriété MaskColor et je gère autrement la transparence dont j'avais besoin. J'ai paramétré ma PictureBox en flat et fond Blanc, pour ajouter mes icones à mon imagelist, je n'ai donc plus besoin d'utiliser MaskColor. Ce qui n'est que mieux puisque j'évite une image Noir et Blanc à chaque fois. Cependant, bien que je pense que ça optimise mon code ça ne résoud pas mon problème d'images corrompues après + de 1300 images !
Et pourtant, comme j'y étais, j'ai aussi optimisé ma pictureBox où j'ai paramétré ClipControls à False puisque je fais un cls avant ....
En fait, je viens de Partiellement trouvé l'explication. En effet, après ces opti du code, je me suis demandé si le problème venait vraiment de l'imageList ou, s'il n'y avait pas 1 problème TreeView associé à l'imageList. J'ai donc testé au sens inverse : 1 fois mon imageList constituée, je transferts dans ma pictureBox pour voir les images. Il n'y a aucune image corrompue dans ImageList.
C'est donc 1 problème lié au TV et je me rappelle avoir vu, je crois sur ce site, qu'il y avait 1 bug connu du TV de Bill quand on utilise CheckBox et image, ce qui est mon cas !  Par contre je ne sais pas comment le régler.
Je te remercie de tes explications et ai écris ce cheminement un peu long pour qu'il serve si kk'1 est dans la même situation.
0
Rejoignez-nous