Paintpicture une image chargée en mémoire

Signaler
Messages postés
201
Date d'inscription
mercredi 25 septembre 2002
Statut
Membre
Dernière intervention
10 novembre 2007
-
Messages postés
201
Date d'inscription
mercredi 25 septembre 2002
Statut
Membre
Dernière intervention
10 novembre 2007
-
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

Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
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.
Messages postés
2169
Date d'inscription
vendredi 20 avril 2001
Statut
Membre
Dernière intervention
30 juin 2009
8
t'as essayé la methode GetData :

Picture1.Picture = Clipboard.GetData(vbCFMetafile)

It@li@
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
29
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
Messages postés
201
Date d'inscription
mercredi 25 septembre 2002
Statut
Membre
Dernière intervention
10 novembre 2007

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...
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
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.
Messages postés
201
Date d'inscription
mercredi 25 septembre 2002
Statut
Membre
Dernière intervention
10 novembre 2007

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...
Messages postés
201
Date d'inscription
mercredi 25 septembre 2002
Statut
Membre
Dernière intervention
10 novembre 2007

C'était effectivement con comme idée... => "Mémoire insuffisante"