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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| Option Compare Database
Option Explicit
' Enter the following Declare statement as one single line:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Type PT
Width As Integer
Height As Integer
End Type
Type OBJECTHEADER
Signature As Integer
HeaderSize As Integer
ObjectType As Long
NameLen As Integer
ClassLen As Integer
NameOffset As Integer
ClassOFfset As Integer
ObjectSize As PT
OleInfo As String * 256
End Type
Sub CreerBMP(Fichier As String, ChampOLE As Field)
Dim NumChunks As Long, TotalSize As Long
Dim RemChunk As Integer, CurSize As Integer
Dim FNum As Integer, CurChunk As String
Dim ChunkSize As Long
Dim i As Long, J As Long
Dim Arr() As Byte
Dim ObjHeader As OBJECTHEADER
Dim Buffer As String
Dim ObjectOffset As Long
Dim BitmapOffset As Long
Dim BitmapHeaderOffset As Integer
ReDim Arr(ChampOLE.FieldSize)
Arr() = ChampOLE.GetChunk(0, ChampOLE.FieldSize)
'Copy the first 19 bytes into a variable 'of the OBJECTHEADER user defined type.
CopyMemory ObjHeader, Arr(0), 19
'Determine where the Access Header ends.
ObjectOffset = ObjHeader.HeaderSize + 1
'Grab enough bytes after the OLE header to get the bitmap header.
Buffer = ""
For i = ObjectOffset To ObjectOffset + 512
Buffer = Buffer & Chr(Arr(i))
Next i
'Make sure the class of the object is a Paint Brush object
If Mid(Buffer, 12, 6) = "PBrush" Then
BitmapHeaderOffset = InStr(Buffer, "BM")
If BitmapHeaderOffset > 0 Then
'Calculate the beginning of the bitmap
BitmapOffset = ObjectOffset + BitmapHeaderOffset - 1
Else
MsgBox "PBrush non trouvé"
End If
End If
'* Définit la taille de la tranche de données.
ChunkSize = 2000
'* Lit la taille du fichier.
TotalSize = ChampOLE.FieldSize() - BitmapOffset
'* Définit le nombre nécessaires de tranches de données.
NumChunks = TotalSize \ ChunkSize
'* Définit le nombre d'octets disponibles, nombre d'octets pour la dernière tranche
RemChunk = TotalSize Mod ChunkSize - 1
'* Définit la taille initiale de la tranche de données.
CurSize = ChunkSize
'* retourne le numéro de fichier disponible.
FNum = FreeFile
'* création du fichier bitmap
Open Fichier For Binary As #FNum
For i = 0 To NumChunks
If i = NumChunks Then CurSize = RemChunk
Buffer = ""
For J = (i * ChunkSize) + (BitmapOffset) To (i * ChunkSize) + (BitmapOffset) + CurSize - 1
Buffer = Buffer & Chr(Arr(J))
Next J
Put #FNum, , Buffer
Next i
Close FNum
End Sub |
Partager