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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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")
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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é.