Bilder on the fly

Es gibt immer mal wieder eine Gelegenheit, Bilder in Datenbanken zu speichern, anzuzeigen oder von dort auf die Festplatte zu speichern. Die meisten Wege führen dabei über das Zwischenspeichern im Dateisystem, manch eine Anwendung belässt die Bilddateien auch direkt im entsprechenden Ordner. Mit einem Image-Steuerelement und einer Tabelle mit einem OLE-Feld behält man alles an einem Ort – nämlich in der Datenbank.

Als Beispiel für diesen Artikel dient die Bücherverwaltung aus dem gleichnamigen Beitrag in dieser Ausgabe von Access im Unternehmen (Shortlink 633). Diese speichert Bilder direkt in der Tabelle tblBuecher zusammen mit den anderen Buchinformationen und zeigt die Bilder im Formular frmBuch zum jeweils passenden Exemplar an (siehe Bild 1). Dabei bezieht sie die Bilddateien aus verschiedenen Quellen: Wenn Sie die Bücher manuell eintragen, können Sie selbst eingescannte oder anderweitig verfügbare Buchcover in der Datenbank speichern, indem Sie einfach auf die Bild hinzufügen-Schaltfläche klicken und das gewünschte Bild mit dem anschließend erscheinenden Datei öffnen-Dialog auswählen.

pic001.tif

Bild 1: Das Beispielformular mit einem Buchcover im Image-Steuerelement

Die Anwendung bietet auch die Möglichkeit, Buchinformationen per Webservice direkt von Amazon einzulesen. Diese Informationen enthalten auch Links zu Coverbildern in verschiedenen Auflösungen und die Anwendung liefert die Möglichkeit, diese Bilder von Amazon herunterzuladen und in der Datenbank zu speichern.

Werkzeug

Als Werkzeug für die in diesem Beitrag beschriebene Lösung dienen einige VBA-Routinen und API-Funktionen, die aus der Beispieldatenbank zum Beitrag Bilder im Griff mit VBA und GDI+ (Shortlink 337) stammen. Die hier verwendete Zusammenstellung wurde teilweise von Sascha Trowitzsch weiterentwickelt und vom Autor des vorliegenden Beitrags für den hier beschriebenen Anwendungsfall zusammengestellt.

Vom Web ins Image-Steuerelement

Für das Herunterladen einer Bilddatei aus dem Internet und ihre Anzeige in einem Formular brauchen Sie zunächst einmal die Funktion GetPictureFromURL aus dem Modul mdlOLE der Beispieldatenbank.

Diese Routine erwartet als Parameter die URL der Bilddatei, zum Beispiel http://www.access-im-unternehmen.de/fileadmin/images/aiu_2008_01.png.

Um die Routine auszuprobieren, brauchen Sie nur ein Microsoft Forms 2.0 Image-Steuerelement in ein Formular einzufügen, dieses beispielsweise objImage zu nennen und beim Laden des Formulars die folgende Routine auszuführen:

Private Sub Form_Load()
    Me!objImage.Picture = _
    GetPictureFromURL( _
    "http://www.access-im-unternehmen.de/€ _
    €fileadmin/images/aiu_2008_01.png€)
    End Sub

Vom Web ins OLE-Feld

Nun soll das Bild aber nicht direkt angezeigt, sondern möglichst erstmal in der Datenbank gespeichert werden – und zwar in einem OLE-Feld in einer Tabelle Ihrer Wahl. In der Beispieldatenbank Buecherverwaltung.mdb heißt das Feld Bild und befindet sich in der Tabelle tblBuecher.

Die oben vorgestellte Funktion GetPictureFromURL dient als Ausgangspunkt für die folgende Vorgehensweise: Sie liefert nämlich immerhin schon einmal ein StdPicture-Objekt, das auf das Bild verweist.

Was aber muss passieren, damit dieses Bild-Objekt nun im OLE-Feld einer Tabelle landet und obendrein leicht wiederherstellbar ist Dank der Funktionen in den beiden Modulen mdlGDIPlus und mdlOLE lässt sich das ganz leicht herleiten. Genau genommen ist es fast wie bei Rechenaufgaben aus technischen Bereichen: Wenn man dort gar nicht mehr weiter weiß, schaut man sich halt die Einheiten an, in denen die Funktions- und Ergebniswerte angegeben werden müssen. Wenn man Einheiten durch Datentypen ersetzt, ist das eine interessante Analogie. Und eine zusätzliche Hilfe bieten natürlich die Funktionsnamen.

Wenn Sie ein StdPicture-Objekt in ein OLE-Feld einfügen möchten, durchsuchen Sie also erstmal die beiden Module nach Routinen, die irgendwas in ein OLE-Feld einsetzen.

Das erledigen sowohl SaveFileToOLEField als auch ArrayToOLEField. Die erste erwartet die Angabe einer Datei und speichert diese im OLE-Feld einer Tabelle, die zweite ein Byte-Array.

Wir müssen aus unserem StdPicture-Objekt also entweder eine Datei erstellen oder dieses in ein Byte-Array umwandeln. Ein Blick in die Liste der zur Verfügung stehenden Routinen zeigt, dass wir mit der Umwandlung von StdPicture zu Byte-Array richtig liegen – die Funktion ArrayFromPicture aus dem Modul mdlGDIPlus macht so etwas.

Wir arbeiten uns also wie folgt durch Funktionen: GetPictureFromURL liefert uns die auf einem Webserver liegende Bilddatei frei Haus als StdPicture-Objekt. Dieses wandelt die Routine ArrayFromPicture in ein Byte-Array um und dieses speichert schließlich die Funktion ArrayToOLEField im OLE-Feld der Zieltabelle.

Dies kann man wiederum in eine neue Funktion kapseln, welche die URL sowie die Daten des Zielobjekts, also des OLE-Felds, als Parameter erwartet. Diese sieht wie in Listing 1 aus und erwartet die folgenden Parameter:

Listing 1: Speichern einer Bilddatei aus dem Web in einem OLE-Feld

Public Function WebToOLEField(strURL As String, strTable As String, strOLEField As String, boolEdit As Boolean, strIDField As String, lngID As Long)
    Dim objPicture As StdPicture
    Dim arr() As Byte
    Dim strFiletype As String
    Dim lngPicType As Long
    Set objPicture = GetPictureFromURL(strURL)
    strFiletype = Mid(InStrRev(strURL, ".€) + 1)
    Select Case strFiletype
    Case "png€
    lngPicType = PicFileType.pictypePNG
    Case "bmp€
    lngPicType = PicFileType.pictypeBMP
    Case "jpg€
    lngPicType = PicFileType.pictypeJPG
    Case "gif€
    lngPicType = PicFileType.pictypeGIF
    End Select
    arr = ArrayFromPicture(objPicture, lngPicType)
    ArrayToOLEField arr, strTable, strOLEField, boolEdit, strIDField, lngID
End Function
  • strURL: Link zur Bilddatei
  • strTable: Name der Zieltabelle
  • strOLEField: Name des Zielfelds
  • boolEdit: Gibt an, ob das OLE-Feld eines neuen (False) oder eines bestehenden Datensatzes (True) gefüllt werden soll.
  • strIDField: Falls boolEdit den Wert True hat, gibt dieses Feld den Namen des Primärschlüsselfeldes der Tabelle an.
  • lngID: Falls boolEdit den Wert True hat, gibt man für diesen Parameter die ID des in strIDField angegebenen Primärschlüsselfelds an.

Im Falle der Bücherverwaltung müssten Sie also den folgenden Aufruf verwenden (in einer Zeile):

WebToOLEField "http://www.access-im-unternehmen.de/fileadmin/images/aiu_2008_01.png", "tblBuecher", "Bild", "True", "ID", 1

Von der Festplatte ins OLE-Feld

Das Formular frmBuch der Beispieldatenbank bietet unterhalb des Image-Steuerelements zur Anzeige des Bilds zwei Schaltflächen an, von denen die eine das Hinzufügen von Bildern aus dem Dateisystem erlaubt.

Durch die Beim Klicken-Ereignisprozedur der Schaltfläche wird die Routine aus Listing 2 aufgelöst.

Listing 2: Speichern einer Bilddatei aus dem Dateisystem in einem OLE-Feld

Private Sub cmdAddPicture_Click()
    Dim strBild As String
    strBild = OpenFileName(CurrentProject.Path, "Bilddatei auswählen€, _
    "Bilddateien (*.bmp, *.png, *.gif, *.png)€)
    If Len(strBild) > 0 Then
        DoCmd.RunCommand acCmdSaveRecord
        SaveFileToOLEField strBild, "tblBuecher€, "Bild€, "True€, "ID€, Me.ID
        RequeryImage
    End If
    End Sub

Die Routine verwendet zunächst die OpenFileName-Funktion aus dem Modul mdlGlobal der Beispieldatenbank, um einen Datei öffnen-Dialog anzuzeigen (siehe Bild 2).

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar