Webcam-Bilder in Datenbank speichern

Die Bilder einer Webcam kann man üblicherweise auf dem Rechner speichern, auf dem man diese erstellt hat. Gegebenenfalls geschieht das auch automatisch – so zum Beispiel mit der Kamera-App von Windows. Ein Leser fragte, ob sich das Aufnehmen von Bildern auch so steuern lässt, dass man die neuen Fotos direkt in einer Datenbank weiterverwenden kann – durch Speichern des Bildes oder des Speicherpfades in der Datenbank und das anschließende Anzeigen des Bildes direkt in einem Formular der Datenbank. Eine direkte Steuerung via VBA haben wir nicht realisiert, aber einen Workaround, der diese Aufgabe ebenso gut erfüllt.

Die Aufgabe lautet also: Wir möchten von einem Access-Formular aus, das beispielsweise ein Produkt anzeigt, die Kamera-App von Windows öffnen, mit dieser ein Bild schießen und dieses dann in der Access-Anwendung so verfügbar machen, dass es direkt im aufrufenden Formular angezeigt werden kann.

Die Idee dazu lautet: Wir öffnen per Mausklick die Kamera-App und starten zum gleichen Zeitpunkt einen Formular-Timer, der alle paar Sekunden prüft, ob in einem bestimmten Ordner eine neue Datei hinzugefügt wurde. Ist das der Fall, soll die neue Datei als Bilddatei zum aktuellen Datensatz hinzugefügt werden.

Die Kamera-App speichert die Bilder nämlich in einem vorgegebenen Ordner (üblicherweise c:UsersPicturesCameraRoll).

Diesen können wir ändern oder ihn einfach übernehmen. Nachdem wir während der Ausführung der Timer-Ereignisprozedur ein neues Bild im angegebenen Ordner entdeckt haben, verarbeiten wir dieses und beenden das Auslösen des Timers. Außerdem soll das Bild nun als neues Bild im Formular angezeigt werden.

Probleme mit der Kamera-App

Eines direkt vorneweg: Die Steuerung der Kamera-App ist ein wenig kompliziert und funktioniert mit der nachfolgend vorgestellten Methode nicht in allen Fällen perfekt. Zunächst einmal muss man wissen, dass die Kamera-App auch gestartet wird, wenn gar keine Kamera vorhanden ist – in diesem Fall erscheint zwar eine Anwendung, aber diese liefert lediglich die Meldung, dass keine Kamera gefunden werden konnte (siehe Bild 1). In diesem Fall wollen wir einfach abfangen, wenn der Benutzer die Meldung und somit die Kamera-App wieder schließt.

Meldung bei fehlender oder deaktivierter Kamera

Bild 1: Meldung bei fehlender oder deaktivierter Kamera

Datenmodell der Anwendung

Für die Anwendung haben wir ein recht einfaches Datenmodell definiert. Wir wollen zu einem Datensatz der Tabelle tblProdukte ein oder mehrere Fotos in der Tabelle tblBilder speichern können und verknüpfen die Tabelle tblBilder wie in Bild 2 über das Fremdschlüsselfeld Produkt-ID.

Datenmodell der Beispieldatenbank

Bild 2: Datenmodell der Beispieldatenbank

Das Feld Bild der Tabelle tblBilder legen wir als Anlage-Feld an. Damit können wir darin nicht nur Bilder speichern, sondern diese auch gleich über das Anlage-Steuerelement im Formular anzeigen.

Neben diesen beiden Tabellen verwenden wir noch eine Tabelle namens tblOptionen, die nur ein Feld namens Fotopfad enthält.

Formulare der Anwendung

Das erste Formular namens frmOptionen verwendet die Tabelle tblOptionen als Datensatzherkunft. Damit der Benutzer nur den vorhandenen Datensatz bearbeiten kann und weder neue Datensätze hinzufügen noch den bestehenden Datensatz löschen kann, stellen wir die Eigenschaften Anfügen zulassen und Löschen zulassen im Entwurf des Formulars auf Nein ein (siehe Bild 3).

Entwurf des Formulars zum Auswählen des Fotopfades

Bild 3: Entwurf des Formulars zum Auswählen des Fotopfades

Die Schaltfläche cmdFotopfad ruft die Prozedur aus Listing 1 auf. Diese verwendet die im Modul mdlTools definierte Funktion OpenPathName, um einen Dialog zum Auswählen eines Verzeichnisses anzuzeigen. Dabei übergibt sie als ersten Parameter den bisher in der Tabelle tblOptionen gespeicherten Ordner und als zweiten den anzuzeigenden Titel für den Dialog.

Private Sub cmdVerzeichnisAuswaehlen_Click()
     Dim strFotopfad As String
     strFotopfad = OpenPathName(Nz(Me!txtFotopfad, CurrentProject.Path), "Fotoverzeichnis auswählen")
     If Not Len(strFotopfad) = 0 Then
         Me!txtFotopfad = strFotopfad
     End If
End Sub

Listing 1: Prozedur zum Auswählen eines Verzeichnisses

In der Formularansicht sieht das Formular wie in Bild 4 aus.

Dialog zum Einstellen der Optionen der Anwendung

Bild 4: Dialog zum Einstellen der Optionen der Anwendung

Formular zum Einlesen von Fotos

Das Formular zum Einlesen und Anzeigen der Fotos besteht aus einem Haupt- und einen Unterformular (siehe Bild 5).

Entwurf des Formulars frmProdukte

Bild 5: Entwurf des Formulars frmProdukte

Das Unterformular heißt sfmProdukte und verwendet die Tabelle tblBilder als Datensatzquelle und zeigt lediglich den Inhalt des Feldes Bild in einem Anlage-Steuerelement an. Nachdem wir dieses Formular angelegt und gespeichert haben, erstellen wir das Hauptformular.

In dieses ziehen wir das Unterformular sfmProdukte. Außerdem legen wir für das Formular frmProdukte die Tabelle tblProdukte als Datensatzquelle fest und fügen die beiden Felder ProduktID und Produktbezeichnung zum Detailbereich hinzu.

Über dem Unterformular platzieren wir die beiden Schaltflächen cmdFotoHinzufuegen und cmdFotoPfadAnpassen.

Letztere ruft die folgende Prozedur auf und öffnet so das Formular frmOptionen als modalen Dialog:

Private Sub cmdFotopfadAnpassen_Click()
     DoCmd.OpenForm "frmOptionen", WindowMode:=acDialog
End Sub

Foto hinzufügen

Die Schaltfläche cmdFotoHinzufuegen soll dafür sorgen, dass die Kamera-App gestartet wird und dass nach dem Fotografieren die im Fotoverzeichnis gespeicherte neue Datei in die Tabelle tblBilder eingelesen und im Formular angezeigt wird.

Dazu benötigen wir eine modulweit deklarierte Variable, deren Funktion wir im Anschluss erläutern:

Dim datStart As Date

Die Prozedur, die durch einen Mausklick auf die Schaltfläche Foto hinzufügen ausgelöst wird, finden Sie in Listing 2. Diese füllt die Variable datStart mit dem Wert der Funktion Now, welche das aktuelle Datum und die aktuelle Uhrzeit liefert. Damit haben wir den Zeitpunkt gespeichert, an dem der Benutzer ein Foto aufnehmen möchte.

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