Où ce trouve la DATA image d'une picture box (VB6), les pixel, les couleur le RG

rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013 - 12 nov. 2012 à 15:12
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013 - 19 nov. 2012 à 16:24
rebonjours...
encore coincé...


Je ne trouve pas où ce trouve les données d'une image dans un picturebox ?!

redim tableau(lx%,ly%) as long
j'aimerais facilement faire
copymemory tableau(0,0), objptr(picture1)+??? 'si c'est bien quelque part à cette adresse

enfaite j'aimerais éviter :
Call GetBitmapBits(la_picture.Image.handle, l&, le_futur_rgb(3))

cela me prend trop de recource...
si seulement je conaissais la structure d'une picturebox ?

12 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 nov. 2012 à 19:09
Bonjour,
Tu as là l'intention de réellement jongler et tu vas te compliquer considérablement l'existence ...
Mais tu as peut-être plus facile à faire.
Ce sera notamment le cas si l'image est chargée depuis un fichier connu (cas le plus fréquent).
Regarde par exemple ce que fait ceci :
Dim taboctets() As Byte
   chemin_fichier = "D:\monoutil\A1.jpg" ' ton fichier image
   Open chemin_fichier For Binary As #1 ' que tu ouvres en binaire
      ReDim taboctets(FileLen(chemin_fichier)) ' on redimensionne notre array d'octets
      Get #1, , taboctets ' on remplit notre array d'octets
   Close #1
   'Preuve
   For i = 0 To UBound(taboctets)
     MsgBox taboctets(i)
   Next





________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
13 nov. 2012 à 20:18
Merci, mais malheureusement c'est pas du tout ce que je cherche, je ne cherche pas l'image bitmap charger à l'origine dans une picturebox !

Je cherche l'adresse mémoire où va l'image d'une capture écran après l'utilisation de la fonction :
StretchBlt la_picture.hdc, Newx%, Newy%, Newx2% - Newx% + 1, Newy2% - Newy% + 1, GetDC(GetDesktopWindow()), xx%, yy%, xx2% - xx% + 1, yy2% - yy% + 1, vbSrcCopy

comme cela je pourrait avec un pointeur copier l'image transmis dans la_picture, pour la mettre dans un tableau de type long !


donc si quelqu'un à la réponse ce serais super, si même quelqu'un à même plutôt l'adresse image de :
"GetDC(GetDesktopWindow())"
ce serais encore mieux comme cela en un seul copymory ou tout autre moyen avec pointeur, je récupére l'image, sans faire toutes ces manipulation avec les api
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 nov. 2012 à 20:54
Ouais,
mais il va te falloir dans ce cas analyser le "torrent" (Istream) et cela me parait à la fois trop éloigné des connaissances d'un débutant, sans pour autant apporter un réel bénéfice par rapport à l'utilisation d'un tableau de dibbits.
Je ne te suivrai donc personnellement pas dans ta démarche.
Bonne chance.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 nov. 2012 à 21:00
En te faisant par ailleurs remarquer ce qui est évident :
Si tu pars (il faut bien partir de quelque chose) d'une image/fichier et que tu la manipules à partir du tableau d'octets qui la représente, toute modification de cette image correspond à une manipulation du tableau d'octets, que tu manipules, lui. Et donc : toute modification de ce tableau est gardée en mémoire (ce tableau).
Le mécanisme est donc, dans l'ordre :
- dresser le tableau d'octets originel
- modifier CE tableau d'octets
- PUIS : faire correspondre l'image à CE tableau
et ainsi de suite ...
Voilà ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 nov. 2012 à 07:16
J'ai cependant voulu chercher pour toi un exposé de ce qu'est Istream. J'ai choisi celui-ci :
Tapez le texte de l'url ici.
pour la clarté de ce qui y est dit.
Lis-le attentivement, car, si tu persistes sur la voie que tu as choisie, c'est par la bonne compréhension de cela qu'il te faudra débuter ton voyage.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 nov. 2012 à 08:17
Je viens également de chercher de quoi illustrer mon dernier message (utilisation de IStream).
Je te propose ce lien :
Tapez le texte de l'url ici.
Tu y trouveras, en message 2, deux liens. Le premier vers un code pour alimenter un tableau d'octets. Le second pour (en utilisant IStream) alimenter l'image à partir du tableau d'octets.
Là s'arrête mon intervention dans la présente discussion.
Bonne lecture et bonne chance.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
14 nov. 2012 à 08:45
je vais regarder cela de suite, merci
et vous te tient au courant !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 nov. 2012 à 10:01
et vous te tient au courant

Non. Inutile (lis donc l'avant dernière phrase de ma réponse précédente).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
15 nov. 2012 à 18:47
bon ben après lecture cela m'aide pas du tout, je crois même que cela aucun rapport !
...
aprés avancement je suis bloqué quelque part là :

lx& (Capture_ecran_X2% - Capture_ecran_X% + 1) * 1: la_picture.Width lx&
ly& (Capture_ecran_Y2% - Capture_ecran_Y% + 1) * 1: la_picture.Height ly&

'---------------------------
EcranDC& = GetDC(0)
tempDC& = CreateCompatibleDC(EcranDC&)
TempBmp& = CreateCompatibleBitmap(tempDC&, lx&, ly&)
TempObjet& = SelectObject(tempDC&, TempBmp&)
BitBlt tempDC&, Capture_ecran_X%, Capture_ecran_Y%, lx&, ly&, EcranDC&, 0, 0, vbSrcCopy

Dim Info_bmp As BITMAP
Call GetObject(TempBmp&, Len(Info_bmp), Info_bmp)
taille& = Info_bmp.bmWidth * 4 * Info_bmp.bmHeight
Adresse& = Info_bmp.bmBits
ReDim tableau(taille&) As Byte
CopyMemory tableau(0), ByVal Adresse&, taille&
'---------------------------

mais j’avoue que je suis plus que perdue !
surtout que j'ais pas du tout l'habitude d'utiliser CreateCompatibleDC,CreateCompatibleBitmap,SelectObject


au secours !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 nov. 2012 à 19:30
1) Il est normal que tu sois perdu.
La meilleure preuve en est :
bon ben après lecture cela m'aide pas du tout, je crois même que cela aucun rapport

2) Relis par ailleurs mes 5 derniers messages. Ils te disent clairement que je te laisse là, en ce qui me concerne.
Bonne chance


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
18 nov. 2012 à 15:19
Bonjour,

Je ne sais pas ce que tu cherches exactement à faire, ne manipulant jamais directement les API pour les images.
J'utilise en fait GDI+ qui est à la fois plus facile (c'est relatif tout de même) et surtout beaucoup plus rapide.

Pour utiliser GDI+ en VB6, va voir ici.
C'est du PureBasic mais l'appel des API GDI+ est facilement transposable avec l'aidede VB Accelerator

Bonne chance

Calade
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
19 nov. 2012 à 16:24
Merci, justement j'en vient du petit GDI !
c'est ce que je devis comprendre au mieux !

j'étais là il y quelque heures :

en faite je n'ai pas trouvé ce que je chercher, mais mieux encore !
je voulais récupérer le pointeur des pixels de picture1.image, mais en faite ne trouvant pas
je me suis pencher à créer mon propre bitmap, puis un bitblt, et et hop je travail avec mes pointeurs dans l'image bitmap où j'ai mon adresse du bitmap houf !!!!

je referais un sujet complet la dessus une fois ma procédure copymemory2 terminer en ASM !
mais sinon vite voilà le cœur de la solution :

'copie de l'écran :
LNG_Handle_DC& = CreateCompatibleDC(GetDC(GetDesktopWindow()))

'création du bitmap et récupération de cette satanée adresse pointeur d'un bitmap
Dim Adresse_du_bitmap&
LNG_Handle_Bitmap& = CreateDIBSection(LNG_Handle_DC&, TYP_Info_Bitmap, DIB_RGB_COLORS, VarPtr(Adresse_du_bitmap&), ByVal 0&, ByVal 0&)
Call SelectObject(LNG_Handle_DC&, LNG_Handle_Bitmap&)

'copie de mon écran vers mon bitmap !
BitBlt LNG_Handle_DC&, 0, 0, New_lx&, New_ly&, GetDC(GetDesktopWindow()), Capture_ecran_X%, Capture_ecran_Y%, vbSrcCopy

'et enfin cela c'est perso, mes importants pour moi la récupération des données du bitmap vers mon tableau avec seulement la récupération du RGB pas du ARGB !
p& = Adresse_du_bitmap&
For Y& = New_ly& - 1 To 0 Step -1
COPYMEMORY2 ByVal p&, le_futur_rgb(Y& * New_lx& + 3), New_lx& - 1, 4, 0, 0, 1, 16777215
p& = p& + New_lx& * 4
Next Y&


'cela y est je suis passé de 27 images seconde à 66 !
'une fois mon copymemory2 terminé avec mon options resize je devrais être à 105/S
'alors qu'avec StretchBlt je fessait avec une petite taille de l'image 57 images secondes
dommage je pensé pouvoir faire 150 images secondes ! mais bitblt prend déjà beaucoup de ressources !

=>>>>
sinon si quelque connait plus rapide que StretchBlt, car je trouve pas normal qu'il soit plus lent que bitblt alors qu'il redimensionne une image plus petite !


bon, je suis content en tout cas, je finie tout cela et je fournie plus tard !

merci.
0
Rejoignez-nous