Comment passer une image présente en buffer mémoire vers PictureBox
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.
Code:
Dim sBufferImage as String
Je souhaite faire passer cette bitmat de ma variable buffer dans un picturebox.
Le seul moyen que j'ai trouvé pour l'instant est de faire une sauvegarde de fichier sur disque puis de relire avec loadpicture
Code:
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") |
Cette solution ne me satisfait pas pour 2 raisons
- 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)
Code:
CopyMemory ByVal ObjPtr(picImageLu.Picture), ByVal StrPtr(sBufferImage), LenB(sBufferImage)
Et là, scrash vb.
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)
Code:
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 |
Merci à ceux qui ont suivi.
Si vous avez quelques idées, ou pourquoi pas une solution, c'est avec joie que j'en prendrai connaissance. ()
Hervé.