Afficher une image depuis la mémoire

cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007 - 8 août 2004 à 16:35
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007 - 10 août 2004 à 00:35
Hello all

Je voudrai afficher une image sur un picturebox ou image, n'importe, mais depuis la mémoire, pas depuis un fichier du disque dur, est-ce possible ?

@Z3RtY25 ==

8 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
8 août 2004 à 18:55
Marche avec BMP GIF ICO CUR JPG :


Private Type GUID
    dwData1         As Long
    wData2          As Integer
    wData3          As Integer
    abData4(7)      As Byte
End Type

Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, riid As GUID, ppvObj As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As GUID) As Long
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long

Private Declare Sub RtlMoveMemory Lib "kernel32" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long

Private Function PictureFromBits(ByRef wBuffer() As Byte) As IPicture
    Dim vStream         As IUnknown
    Dim vIID_IPicture   As GUID
    Dim vSize           As Long
    Dim vhMem           As Long
    Dim vPtr            As Long
    vSize = UBound(wBuffer) + 1
    vhMem = GlobalAlloc(&H2, vSize)
    If vhMem Then
        vPtr = GlobalLock(vhMem)
        If vPtr Then
            RtlMoveMemory ByVal vPtr, wBuffer(0), vSize
            GlobalUnlock vhMem
            If (CreateStreamOnHGlobal(vhMem, 1, vStream) = 0) Then
                If (CLSIDFromString(StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), vIID_IPicture) = 0) Then
                    OleLoadPicture ByVal ObjPtr(vStream), vSize, 0, vIID_IPicture, PictureFromBits
                End If
            End If
        End If
        GlobalFree vhMem
    End If
End Function


@+

E.B.
0
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007
8 août 2004 à 19:31
Puré, mais t'ai un dingue lol. Je comprend pas le fonctionnement tellemement j'ai jamais vu ça dans un forum :'(
Désolé de te déranger mais tu pourrai m'expliquer ce que ton code fait et comment on fait pour mettre une image dans un control ? J'aurai peut etre du préciser mais l'image, je l'ai grace à l'instruction
Dim Var
Var = Inet1.OpenURL("http://telecharger.01net.com/images/logo.gif", icByteArray)
Voili voiloo, je te remercie tout de même !! ;)

@Z3RtY25 ==
0
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007
8 août 2004 à 19:34
Oups désolé, je suis allé trop vite, il fallai déclarer : Dim Var() as Byte.
Mais si tu veux, tu peut toujours expliquer ce que ton code fait, c'est bien aussi de comprendre à part exploiter :-o

@Z3RtY25 ==
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
8 août 2004 à 19:52
lol mon code ? ben il fait ce que tu as demandé :

"Afficher une image depuis la mémoire"

tu recupere les données dans un tableau genre :

Dim Var
Var = Inet1.OpenURL("...gif", icByteArray)

puis tu dessine dans un picturebox :

Set Picture1.Picture=PictureFromBits(Var)

apres selon le format et si les donnée sont bonnes
ou pas l'image s'affiche ou non

@+

E.B.
0

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

Posez votre question
MoiOlivier Messages postés 172 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 4 août 2005
8 août 2004 à 22:23
Salut,

Je vais être vulgaire, désolé... Mais...

P'tain EBArtSoft, c'est une bête !
C'était plus fort que moi.
Ca fait des mois que je cherche un truc du genre, et pas moyen, je crois avoir tapé tous les mots-clé possibles et imaginables, et ce sans résultat (rien, nada, que dalle).

Merci.
0
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007
8 août 2004 à 22:45
Oui MoiOlivier, je te le fait pas dire, c'est une bete ;) regarde ces autres sources si t'es pas convaincu (ce que je doute lol ;) ...)
Sinon, ce que je voulai dire par son fonctionnement c'est pas vraiment ça, mais certaines lignes en fait me chagrinent :

vhMem = GlobalAlloc(&H2, vSize)
If vhMem Then
vPtr = GlobalLock(vhMem)
If vPtr Then
RtlMoveMemory ByVal vPtr, wBuffer(0), vSize
GlobalUnlock vhMem
If (CreateStreamOnHGlobal(vhMem, 1, vStream) = 0) Then
If (CLSIDFromString(StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), vIID_IPicture) = 0) Then
OleLoadPicture ByVal ObjPtr(vStream), vSize, 0, vIID_IPicture, PictureFromBits
End If
End If
End If
GlobalFree vhMem

La dedans, je pige plus grand chose, à part qu'on alloue de la mémoire, on enleve un truc, on créé un stream je sais pas quoi, les CLSID, je sais pas ce que c'est et encore moins le numero a rallonge, apres le vIID Picture, apres, je sais pas et apres on libere apparament de la mémoire. Voila ce que j'ai compris et je pense que c'est pas juste. Voili voiloo, si tu pouvai me donner qq explications ... :)

Encore merci ! Tu nous dépanne bien ! Je pensai mm pas que l'on pouvai faire ceci en VB !

@Z3RtY25 ==
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
8 août 2004 à 23:26
Merci pour les eloges mais ce sont des codes que l'on trouve un peu partout quant on sait quoi cherché et je sait que c'est pas evidant de savoir quoi chercher ;)

pour detailler la fonction voici ce que ça fait :

vhMem = GlobalAlloc(&H2, vSize)
vPtr = GlobalLock(vhMem)
RtlMoveMemory ByVal vPtr, wBuffer(0), vSize
GlobalUnlock vhMem

- on alloue de la memoire global puis on copie
- les donnée de l'image

CreateStreamOnHGlobal(vhMem, 1, vStream)
CLSIDFromString(StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), vIID_IPicture)

- la on crée une instance de l'objet IPicture la chaine est
- simplement le numero unique qui identifie ce type
- d'objet dans la base de registre

OleLoadPicture ByVal ObjPtr(vStream), vSize, 0, vIID_IPicture, PictureFromBits

- la on crée l'image a partir des donnée et de l'objet

GlobalFree vhMem

- puis on peut liberer la memoire car l'objet a fait une copie

voila c'est tout

@+

E.B.
0
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007
10 août 2004 à 00:35
Oké, merci bien, je comprend mieux maintenant !

@Z3RtY25 ==
0
Rejoignez-nous