Paintpicture une image chargée en mémoire

boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007 - 20 août 2004 à 16:20
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007 - 20 août 2004 à 23:25
Ici il y a 2 questions:

1- Comment faire pour charger une image jpg en mémoire?
La raison pour procéder ainsi est de sauver du temps car j'ai près de 1000 images à traiter et avec la méthode conventionnelle du picturebox, le traitement prend près de 3 min.

2- Une fois cette image chargée en mémoire, je voudrais l'utiliser avec la méthode Paintpicture.

Un petit code ou une référence à un code ferait bien mon affaire...
Merci

7 réponses

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
20 août 2004 à 16:35
Bonjour boursicotteur,

c'est tres simple si ton fichier jpg est dans un fichier tu fait ceci :

Dim Tmp As IPicture
Set Tmp = LoadPicture("C:\Monimage.jpg")


Si tu veux faire un tableau de jpg tu fait ceci :

Dim Tmp As New Collection

With Tmp
.Add LoadPicture("C:\Image1.jpg")
.Add LoadPicture("C:\Image2.jpg")
end With


ensuite tu acceded au image comme ceci :

Set PictureBox1.Picture = Tmp (cas 1)

ou 

Set PictureBox1.Picture = Tmp(1)
Set PictureBox1.Picture = Tmp(2) (cas 2)


@+

E.B.
0
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
20 août 2004 à 17:09
t'as essayé la methode GetData :

Picture1.Picture = Clipboard.GetData(vbCFMetafile)

It@li@
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
20 août 2004 à 18:23
comme EBArtSoft l'a dit:
Dim Tmp As IPicture
ça marche aussi avec:
Dim Tmp As Picture
Dim Tmp As IPictureDisp
Dim Tmp As StdPicture

et ensuite après Set Tmp = LoadPicture("C:\Monimage.jpg")
au plus simple: Picture1 = Tmp

pour récupérer les dimensions en pixels:
Lx = ScaleX(Tmp.Width, vbHimetric, vbPixels)
Ly = ScaleY(Tmp.Height, vbHimetric, vbPixels)

pour paintpicture tout dépend ce que tu veux faire.
par exemple pour diviser les dimensions par 2:
Picture1.BorderStyle = 0
Picture1.Width = Lx / 2
Picture1.Height = Ly / 2
Picture1.PaintPicture Tmp, 0, 0, Picture1.ScaleWidth, Picture1.ScalleHeight, 0, 0, Lx, Ly

Daniel
0
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
20 août 2004 à 18:42
Réponse à EBArtSoft:

Présentement j'utilise ceci:

Dim pic As StdPicture
Set pic = LoadPicture(picPath & "" & picNom)
...
pbxVignettes.PaintPicture pic, Xd + Xoffset, Yd + Yoffset, Wd, Hd

J'ai remplacé StdPicture par IPicture (ne figure pas dans liste mais fonctionne quand même) et le temps est le même que pour StdPicture. Idem pour IPictureDisp.

Réponse à ITALIA:
Ca ne fonctionne pas avec vbCFMetafile mais c'est OK avec vbCFBitmap. Mon image étant sur le disque dur, il m'a fallu la mettre dans le clipboard.

J'ai fait un essai avec ceci:

For nn = 1 To 562
DoEvents

Clipboard.SetData LoadPicture(App.Path & "\ImageTest" & "" & fgResult.TextMatrix(1, 1)), vbCFBitmap
pbxVignettes.Picture = Clipboard.GetData(vbCFBitmap)
Next

Ici encore le temps est identique à celui de ma méthode.

J'ai chronométré mon code et l'instruction LoadPicture consomme la majeure partie du temps (~90%); Ce qui explique pourquoi vos deux méthodes donnent le même temps que la mienne.

En parlant de mettre l'image en mémoire, je pensais surtout à utiliser des API qui agissent directement sur un espace mémoire mais "en y réfléchissant bien" je suppose que ca va donner le même résultat puisqu'il faudra encore utiliser un équivalent API de loadpicture...
0

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

Posez votre question
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
20 août 2004 à 18:51
Ok j'ai pigé ton probleme mais quoi qu'il arrive tu devra charger ton image a partir du fichier donc le temp d'acces qu'il soit avec des API ou avec les objet de vb seront les memes. Les acces disque sont tres lent mais tu ne peut pas faire autrement mis a part crée un mapping de fichier et lire les données de l'image qui de toute façon seront lut a partir du disque.

Ce sera fatallement lent !

@+

E.B.
0
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
20 août 2004 à 19:25
Je viens d'avoir une idée bizarre pour contourner ce temps d'accès mais ca va causer au moins deux autres problèmes(grosseur appli et temps de programmation).

Je vais essayer de mettre toute les 1000 images (20 Mo) dans un imagelist au moment de la programmation... Ou mieux encore, je vais essayer d'en créer un vrai avec du code VB

Ca peut marcher tellement c'est con mais c'est vraiment pas pratique...

Je vais quand-même satisfaire ma curiosité juste pour voir si ca va planter...
0
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
20 août 2004 à 23:25
C'était effectivement con comme idée... => "Mémoire insuffisante"
0
Rejoignez-nous