Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Bilder aus Access-BLOB in Picture-Control anzeigen: EIN LÖSUNGSWEG

29 views
Skip to first unread message

Andreas Bering

unread,
Jan 7, 2001, 6:29:38 AM1/7/01
to
Hallo NG

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

0 new messages