Miniature d'image lente a générer

archimed111 Messages postés 12 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 31 octobre 2008 - 9 juil. 2006 à 14:43
archimed111 Messages postés 12 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 31 octobre 2008 - 11 juil. 2006 à 22:44
Bonjour


Je suis entrain de créer un petit browser d'images à la ACDSee

J'utilise (pour le moment) du classique Treeview, ListView, ImageList et PictureBOX.


Le probléme c'est lors de la génération des miniatures (pour mettre dans le ListView)

C'est très très lent. Du genre 200ms par image ! L'apercu de 100 images environ 20 secondes ...


J'ai trouvé une petit astuce, je lis dans les données exif des images
la miniature dans ce cas c'est très rapide mais ça ne résoud pas
vraiment le probléme, toutes les images ne posséde pas de minature exif
et surtout la miniature exif n'est pas très grande.


J'ai essayé plusieurs méthode pour la calcul de la miniature
(GetThumbnailImage, Image.FromFile...) mais c'est toujours assez lent.


Pourtant sous Windows en quand je lui demande d'afficher les miniatures des images c'est vraiment très rapide.


Comment donc calculer ces images très rapidement ? Y'a pas une fonction
dans les API de windows (comme il fait ça très rapidement) ?


Merci de votre aide.

10 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
9 juil. 2006 à 15:28
salut,
mis à part que Windows n'est pas fait en VB .... (rapport à la rapidité), décrit nous "comment" tu affiches ces miniatures... (API, fonctions VB, fonctions PictureBox, autre....)

++

Prenez un instant pour répondre à ce sondage svp
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
9 juil. 2006 à 15:29
ps : de toute façon il faut prendre en compte aussi la lenteur et les ressources du framework....
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:29
Salut, Hum, je doute que ACDSee soit écrit en VB (quelque version que ce soit).
0
archimed111 Messages postés 12 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 31 octobre 2008
9 juil. 2006 à 16:52
Je sais bien que ACDSee est pas fait en VB

Donc comment je fait alors j'ai un Treeview, qui affiche d'arborescence du disque.
Une listview en LargeIcon.
Des que l'on clique sur un dossier du treeview je cherche les fichiers qui sont des images.
Je balaye ces fichier fichiers images 1  à 1  , je les ajoutent en item dans la ListView, et j'ajoute la miniature a l'imagelist qui est associé au ListView rien de bien compliqué.

Une fois que l'utilisateur a cliqué sur une des images de la Listview j'affiche l'image correspondante dans une picturebox.

Ce qui pose probléme un probléme c'est de mettre la miniature dans l'imagelist.
A chaque image je dois la charger, et retourner une image redimensionné que je met dans l'imagelist.

J'ai essayé de retourné le bitmap a l'imagelist de plusieur facon  System.Drawing.Image.FromFile(path).GetThumbnailImage(64, 64, Nothing, System.IntPtr.Zero)
New Bitmap(Image.FromFile(path), 64, 64)

Mais c'est toujours assez lent.
Le seul truc plutot rapide que j'ai trouvé et de charger la miniature qui se trouve dans les données EXIF de l'image (si elle en contient)
0

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

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 juil. 2006 à 08:09
rien ne t'empeche d'utiliser un BackgroundWorker, et de faire ce tratiement non primordial en fond de tache...

tu peux, par exemple, commencer en ne chargeant que les images qiu sont
vues directement, et poursuivre le chargement dans cet autre thread...


utilises les miniatures des données EXIF si ca te dis.... enregistre
une miniature pour les fichiers qui n'en ont pas, tu gagneras du temps
pour les prochaines instances de ton programme.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
misterN Messages postés 40 Date d'inscription samedi 21 août 2004 Statut Membre Dernière intervention 14 décembre 2012
10 juil. 2006 à 09:23
>Renfield

En toute sincèrité,
Je suis admiratif de tes sources ainsi que celles de EbArtSoft.

Il fallait que je le dise car se mettre à vos niveaux pour ma part est encore loin à l'horizon...
Je reviens donc plutôt à ce qui me tracasse...si ton temps libre te le permet...

- je développe aussi une appli avec un PictureBox conteneur d'autres PictureBox destinés à afficher des vignettes, ça c'est en cours...

...mais mes soucis sont les suivants:

1- Pour le ScrollBar est que l'api ShowScrollBar de la Form est la bonne solution
ou y a t'il un autre solution qui permette d'utiliser aussi MouseWheel

2 - Pour optimmiser l'affichage comment "utiliser un BackgroundWorker " cf ta réponse à archimed111

Merci d'avance...

@+

mister N
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 juil. 2006 à 09:56
Merci^^

Le BackgroundWorker, c'est pour .Net....
VB6, lui, n'aime pas les threads....
j'ai dejà bossé sur un truc du même genre... tu peux ne charger les images qu'au moment de les afficher, si elles ne sont pas déjà chargées. de sorte que tu n'en chargent finallement qu'une poignée, au démarrage.

pour la molette, il va te falloir subclasser le message WM_MOUSEWHEEL

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
archimed111 Messages postés 12 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 31 octobre 2008
10 juil. 2006 à 23:11
Merci de m'avoir répondu.
J'ai fait quelques test et je sais ce qui ralentis vraiment.
En fait ce n'est pas le redimensionnement du Bitmap en lui même , que se soit avec GetThumbnailImage de System.Drawing.Image ou même en en faisant pixel par pixel en code unsafe ça prend dans les ~40 ms

Par contre ce qui vraiment beaucoup  de temps c'est la simple déclaration du bitmap
Un simple
Dim img as new bitmap(path)  prend environ 190 ms sur une image de 1000x1000 pixels.

Je ne vois donc vraiment pas comment faire.
C'est vrai que je peux utiliser des threads c'est une bonne idées et mettre au passage les miniatures EXIF pour les fichiers qui n'en ont pas mais c'est quand même très très lent :(
~200 ms pour une image, 500 images ca fait presque 2minutes quand même juste pour afficher des miniatures.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
11 juil. 2006 à 09:33
"la simple déclaration du bitmap"

en faisant : new bitmap(path)

tu fais plus que le déclarer, tu le charge...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
archimed111 Messages postés 12 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 31 octobre 2008
11 juil. 2006 à 22:44
Je suis obliger de charger l'image justement pour faire le resize et c'est ca qui prend du temps.

Je viens d'essayer en passant par des libraires externes comme ImageMagick ou freeimage, avec ImageMagick c'est encore plus lent, par contre avec freeimage c'est un petit peu plus rapide mais pas énormement non plus.
Je chercher encore ...
0
Rejoignez-nous