Bonjour,
j'ai un fichier bitmap (.bmp) dans une variable buffer (string) nommé "sBufferImage". (c'est une "image mémoire" du "fichier disque .bmp" qui est présent dans la variable)
la variable est déclaré de cette façon.
Je souhaite faire passer cette bitmat de ma variable buffer dans un picturebox.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim sBufferImage as String
Le seul moyen que j'ai trouvé pour l'instant est de faire une sauvegarde de fichier sur disque puis de relire avec loadpicture
Cette solution ne me satisfait pas pour 2 raisons
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 iNumFichier = FreeFile Open App.Path & "\UneImage.bmp" For Binary Access Write As #iNumFichier Put #iNumFichier, 1, sBufferImage Close #iNumFichier picImageLu.Picture = LoadPicture(App.Path & "\UneImage.bmp")
- manque de performance; l'écriture et la lecture sur disque sont plus lent qu'un travail direct en mémoire.
- je trouve que écrire un fichier sur le disque pour le relire aussitôt est un procédé qui ne va pas.
Je cherche donc un moyen pour effectuer cette opération directement en mémoire.
J'ai essayé avec :
1) copymemory (je n'y croyait pas trop)
Et là, scrash vb.
Code : Sélectionner tout - Visualiser dans une fenêtre à part CopyMemory ByVal ObjPtr(picImageLu.Picture), ByVal StrPtr(sBufferImage), LenB(sBufferImage)
CopyMemory n'interpréte pas le type de données pour transtyper (c'est beau de réver)
Donc j'écrase d'autres données et scrach.
2) avec les api pour le clipboard (OpenClipboard, EmptyClipboard SetClipboardData, CloseClipboard) mais il y a une distinction entre texte (vbCFText=1) et image (vbCFBitmap=2)
3) J'ai réfléchi avec l'api "OleCreatePictureIndirect" et d'autres qui lui sont associés, mais il faut des handles et ma variable buffer n'en a pas.
Pour tester et vous mettre en situation vous pouvez utiliser ce code (un bouton, un picturebox)
Merci à ceux qui ont suivi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Private Sub Command1_Click() CopieImageSpecial End Sub Sub CopieImageSpecial() Dim iNumFichier As Long Dim sBufferImage As String Dim sNomfichierLu As String Dim sNomfichierEcrit As String sNomfichierLu = App.Path & "\monimage.bmp" ' mettez un nom de fichier image à vous présent dans le rertoire de l'appli sNomfichierEcrit = App.Path & "\Copieimage.bmp" ' lecture image (bmp) iNumFichier = FreeFile Open sNomfichierLu For Binary Access Read As #iNumFichier sBufferImage = Input(LOF(1), #iNumFichier) ' contient une "image mémoire" du fichier .bmp Close #iNumFichier ' ici il faudrait la copie mémoire directe pou compléter le picturebox ' pour test ' écriture nouvelle image (bmp) sur disque iNumFichier = FreeFile Open sNomfichierEcrit For Binary Access Write As #iNumFichier Put #iNumFichier, 1, sBufferImage Close #iNumFichier ' vérif en chargeant le picturebox Picture1.Picture = LoadPicture(sNomfichierEcrit) ' fin test End Sub
Si vous avez quelques idées, ou pourquoi pas une solution, c'est avec joie que j'en prendrai connaissance. ()
Hervé.
Partager