Problembeschreibung:
In einer Access Datenbank sind Bilder in einer BLOB-Spalte eingebettet.
Diese sollen in einer PictureBox angezeigt werden. Die PictureBox kann
zwar an die Spalte angebunden werden, die Bilder werden aber nicht
angezeigt.
Lösungsansatz:
Der hier beschriebene Lösungsansatz speichert die BLOB-Informationen
in einer Datei und kürzt diese um die Zusatzinformationen, die Access
zur
Verwaltung verwendet. Die so erzeugte Datei wird mit der LoadPicture-
Methode geladen.
Anmerkungen:
Bei BMP-Dateien verwendet Access zu Beginn des BLOBs 72 Byte und
am Ende 34 Byte zur Verwaltung. Bei anderen gespeicherten Bildformaten
sind andere Offsets zu verwenden.
Diese können wie folgt ermittelt werden.
1. Einlesen der Bilder in eine Datenbank
2. Schreiben des BLOBs auf die Platte
3. Vergleichen mit einem Hex-Editor
Meine Bitten:
1. Wenn jemand eine elegantere Methode findet, um die Bilder anzeigen
zu
lassen, möchte er es mir bitte zumailen.
2. Wenn jemand Offsets für weitere Bildformate ermittelt, wäre ich
eben-
falls für eine kurze Nachricht dankbar.
Die Lösung im einzelnen:
1. Öffnen Sie ein neues Standardprojekt.
2. Unter Projekt --> Referenzen die folgende Lib einbinden:
Microsoft ActiveX Data Objects 2.5 Object Library
3. Erzeugen Sie Drei Buttons und benennen Sie diese wie folgt:
a) cmdSave
b) cmdConvert
c) cmdShow
4. Fügen Sie eine PictureBox mit dem Namen "Picture1" ein.
5. Kopieren Sie folgenden Code in die Form
Option Explicit
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mstream As ADODB.Stream
Const DatFile = "C:\blob\Bild2.dat" '### Ändern Sie hier
den Namen der BLOB-Datei
Const PicFile = "C:\blob\bild2.bmp" '### Ändern Sie hier
den namen der BMP-Datei
Private Sub cmdConvert_Click()
BlobToPicture
End Sub
Private Sub cmdSave_Click()
Set cn = New ADODB.Connection
'### Ändern Sie hier die Datenbank
cn.Open "DSN=MS Access 97-Datenbank;DBQ=C:\LMDB\LM 0-0
.mdb;DefaultDir=C:\LMDB;DriverId=281; _
FIL=MSAccess;FILEDSN=C:\Programme\Gemeinsame Dateien\ODBC\Data
Sources\MS Access 97-Datenbank _
(not sharable).dsn;MaxBufferSize=2048;PageTimeout=5;UID=admin;"
Set rs = New ADODB.Recordset
'### Ändern Sie hier die Tabelle, in der die BLOB-Infos
enthalten sind
rs.Open "SELECT * FROM tabelle WHERE id = '4711'", cn,
adOpenKeyset, adLockOptimistic
Set mstream = New ADODB.Stream
mstream.Type = adTypeBinary
mstream.Open
mstream.Write rs.Fields("Bild").Value
'### Ändern Sie hier die Spalte, in der das Bild gespeichert ist
mstream.SaveToFile DatFile, adSaveCreateOverWrite
rs.Close
cn.Close
End Sub
Sub BlobToPicture()
Dim fdDAT As Integer
Dim lenDAT As Long
Dim fdPIC As Integer
Dim Data() As Byte
Dim i As Long
Dim picDATA() As Byte
Const TopOffSet = 72 '### Gilt nur für
BMP-Dateien
Const BottomOffSet = 34 '### Gilt nur für
BMP-Dateien
'### Auslesen der Exportierten Datei
fdDAT = FreeFile
Open DatFile For Binary Access Read As #fdDAT
lenDAT = LOF(fdDAT)
Data = InputB(lenDAT, fdDAT)
Close #fdDAT
'### Entfernen der Access-Verwaltungsinformationen
ReDim picDATA(UBound(Data) - TopOffSet - BottomOffSet)
For i = TopOffSet To UBound(Data) - BottomOffSet
picDATA(i - TopOffSet) = Data(i)
Next i
'### Schreiben Zieldatei
fdPIC = FreeFile
Open PicFile For Binary Access Write As #fdPIC
Put #fdPIC, , picDATA
Close #fdPIC
End Sub
Private Sub cmdShow_Click()
Picture1.Picture = LoadPicture(PicFile)
End Sub
6. Wenn Sie dieses Programm ausführen, können sie mit cmdSave die
BLOB-
Informationen auf die Platte schreiben (DatFile).
Mit dem Button cmdConvert wird die Datei umgewandelt in eine
BMP-Datei
(PicFile)
Mit dem Button cmdShow wird die Datei im PictureClip dargestellt.
LastNotLeast:
Die Lösung ist weder elegant noch schön. Ich denke aber, sie ist
ausreichend,
um selbst was draus zu machen.
In diesem Sinne viel Spaß beim Implementieren.
A. Bering