Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Exif Class-File

Begonnen von accessundich, Januar 08, 2011, 12:44:15

⏪ vorheriges - nächstes ⏩

accessundich

Hallo in die Runde,

bin gerade dabei meine Bilddatenbank zu schreiben und bin dabei auf ein sehr brauchbares Exif-Classfile gestoßen, welches ich hier kurz einmal vorstellen möchte.


Das Exif-Modul (Exchangeable Image File Format) erlaubt es, Metadaten, die in Form von sogenannten "Tags" in einem Bild hinterlegt sind, auszulesen. Diese Exif-Daten werden direkt in die Bilddatei während der Aufnahme, aber auch später durch beispielsweise Bildbearbeitungsprogramme, geschrieben.
Das Exif-Modul bzw. das Classfile wurde von der Internwebsite "http://sourceforge.net/projects/exifclass/" heruntergeladen.
Die Installation des Classfiles gestaltet sich recht einfach.  VBA-Editor öffnen, die Datei "ExifReader.cls" in ein öffentliches Modul reinziehen, kompilieren, speichern, fertig.
Es findet sich nun auf der linken Seite, unter "Module" ein neues Modul: "Exif Reader".


Der Aufruf in VBA ist recht einfach: Objekt referenzieren, Bilddatei laden und die entsprechenden Informationen auslesen.
Als Methode steht "Load" zur Verfügung und es gibt drei Eigenschaften: "picfile", "Tag" und "MakerNoteTag". Letzteres ist laut "readme" noch "Under Construction" und darauf wird hier nicht näher eingegangen.
Beispielanwendung:
Man erstelle auf einem Formular ein Button mit der Bezeichnung: "Exif" und hinterlege hinter das "Click-Ereignis" den folgenden Beispielcode:
Private Sub btnExif_Click()
   Dim BildPfad As String 'Pfad zum Digitalbild
   BildPfad = "T:\OK\Fertig\Fotorahmen 16_9\bild-460.jpg"
   
   Dim objExifReader As ExifReader
   Set objExifReader = New ExifReader
   
   objExifReader.Load BildPfad 'Hier wird das Digitalbild geladen
   MsgBox "Auslösezeit: " & objExifReader.Tag(ExposureTime) & vbCrLf _
   & "Zeitpunkt an dem das Bild als Digitale Datei gespeichert wurde: " & objExifReader.Tag(DateTimeDigitized), vbInformation
   
   Set objExifReader = Nothing
End Sub


Nach Klick auf den "Exif-Button" erhält man nun die gewünschten Exif-Informationen:
Auslösezeit: 1/1000
Zeitpunkt an dem das Bild als Digitale Datei gespeichert wurde: 2007:07:14 12:45:59

Ach ja, das zugehörige Bild:


Schöne Geschichte will ich meinen und vielleicht hat ja der eine oder andere Bedarf.

Viele Grüße
Andi
---
Ich stelle keine komischen Fragen: Ich bin komisch.

database

#1
Hallo Andi,

das ist eine ziemlich interessante Angelegenheit!
Werde mir das mal archivieren...  ;)

p.s. ....aber da gab's schon einmal einen Beitrag von dir dazu ....  http://www.access-o-mania.de/forum/index.php?topic=11580.msg63685#msg63685

accessundich

Jo, grüße Dich.

Wollte die Geschichte mal ausführlicher vorstellen und werde mit Sicherheit auch noch das eine oder andere hoffentlich interessante Teil aus der neuen DB vorstellen.
Jetzt erst einmal zu meiner Lieblingsgeschichte: ERM.
Dass macht mir wirklich Spass  :D

Viele Grüße
Andi
---
Ich stelle keine komischen Fragen: Ich bin komisch.

Bembel

Ich bin gerade dabei mir eine mdb für meine Bilder anzulegen. (Win7 Ultimate, Access2003)
ExifReader erzeugt bei mir nur Fehlermeldungen. Entweder Laufzeitfehler 6 = Überlauf oder
Laufzeitfehler 9 = Index außerhalb des gültigen Bereichs. Egal was das Teil lesen soll(Breite, Höhe, Datum). Es gibt auch keine Meldung aus daß das Bild keine Exif-Daten enthält. Wo liegt der Fehler? Bei mir oder im Code?  :-\

database

Hallo,

also der oben zur Verfügung gestellte Code funktioniert sogar unter Access 2010 problemlos!
Was hast du insgesamt gemacht, wie hast du den Code implementiert?
Hast du irgendwas daran verändert?
Woher stammt die Bildquelle?

Hondo

Andi,
wie war das nochmal mit den Bienen und den Blumen? Hatte da irgendwas in Erinnerung ...;-)
Ansonsten danke für deine Infos.

Andreas

Bembel

Erst einmal Dank für die Antwort.
Die cls habe ich in eine neue (leere) mdb importiert. An dem Code habe ich nichts verändert. Den Code für die Sub habe ich auch mit Copy/Paste übernommen und anschließend mit verschiedenen Bildern die cls im Debug-Modus Zeile für Zeile abgearbeitet. In der cls selbst kommt keine Fehlermeldung. Aber wenn ich wieder bei "objExifReader.Load BildPfad" bin kommt eine Fehlermeldung.
Die Bilder enthalten EXIF-Daten, das habe ich mit verschiedenen Programmen überprüft. Bei manchen ist nur die Auflösung (Breite und Höhe) drin. Bei anderen alles was man braucht und auch das was mich nicht interessiert.
Vielleicht liegt es auch an meinem PC. Sony Vajo mit Intel Core2 Duo. Jedesmal wenn in der cls nach "IsIntel" gefragt wird kommt die Anwort "False".
Wenn alle Stricke reißen lese ich die EXIF-Sachen halt mit dem Exif-Viewer aus und ziehe mir die Angaben in meine Datenbank.
Oder jemand hat eine Idee woran es liegt. Ich habe schon mal auf der Seite von  sourceforge nachgeschaut. Aber dort ist nichts.

Bembel



daolix

Hallo

ich kenne die Class nicht. Alternativ könntest du das mit GDIP versuchen, damit kann man auch exif-Daten auslesen. Dann brauchst du kein externes Programm.
ich glaub nicht das es an deinem PC liegt, "IsIntel" ist eher nach der Frage wie ein Value im Speicher liegt oder hinzulegen ist, denn die Frage nach deiner CPU.

Bembel

Und was ist das und wo kriege ich es her? Ich hab mal kurz gegoogelt und was da steht wirkt nicht wirklich vertrauenerweckend. Eventuell ist auch was Anderes gemeint.


daolix

Hallo

im Normalfall hast du die Bibliothek schon, kommt von Microsoft. Ob das nun vertrauenserweckend ist oder nicht darf jeder für sich bewerten.
Anbei ne simple mdb wie du mit GDIP die Exif's auslesen kannst.

Bembel

 :)DANKE!
Genau das was ich brauche. Bisher habe ich, trotz ausgiebiger Suche, nirgends einen Hinweis gefunden daß das Office mit Bordmitteln kann. Ich mußte nur den Verweis auf die MSO.DLL anpassen. Keine Ahnung warum. Aber dann lief es wie geschmiert. Egal was ich da reingezogen habe.
Jetzt muß ich den Code nur noch so umbauen daß er mir in einem Rutsch die komplette Sammlung von ca. 60Tsd Pics einliest und die interessanten Tags speichert.

Bembel

Hondo

Hallo,
das Listenfeld ist ungeeignet da die Größe begrenzt ist. Bei bestimmten Grafiken kommt dann der Fehler 2176 (die Einstellung dieser Eigenschaft ist zu lang).
Besser wäre ein RichTextField zu verwenden.
Zufälligerweise ist das Thema auch auf ActiveVB: http://foren.activevb.de/forum/vb-classic/thread-403644/beitrag-403652/Re-Exif-Viewer-und-Datum-der-Di/
Die dortige VB-Lösung hab ich mal nach Access 2010 portiert (incl. Copyrighthinweis versteht sich.)
Anbei das Ergebnis.

Gruß Andreas

Bembel

Danke. Das habe ich auch schon gemerkt und mit OnError abgefangen. Bis jetzt kam noch kein Fehler. Ich hab mir allerdings erst einen Ordner mit ca. 7000 Pics und etwa 180 Unterordnern vorgeknöpft. Die Bilder sind teilweise aus der Steinzeit der Digitalkameras oder ganz ohne EXIF.
Ich will mir nicht alle Tags speichern. Mich interessieren nur sechs Angaben. Den Rest habe ich in den Properties auskommentiert. So geht der Lesevorgang auch schneller.
Mit der angehängten Zip kann ich nichts anfangen. Ich habe Access 2003. Aber trotzdem Danke für die Mühe. Vielleicht kann ich daraus was in meine Db über den Import von externen Daten rausziehen.

Bembel

daolix

Hallo
bei den zu langen Props wird es sich wahrscheinlich um irgendwelche Binärdaten handeln, Thumbs, Arrays etc. dafür ist die Listbox als Ausgabe wahrlich nicht geeignet. Wenn diese in die DB gespeichert werden sollen so sind diese in eine Tabelle mit einem OLE-Feld zu packen.
@Bembel
in Bezugnahme auf deinen anderen Thread, bestimmung Dimension Bilder ohne Exif, so kannst du diese ebenfalls mit gdip erledigen.


Bembel

Die Riesenprops sind die Angaben zu den Thumbnail-Tags. Der Rekord liegt bis jetzt bei einer Länge von ca. 60 000 Zeichen. Die speichere ich sowieso nicht. Aber sonst läuft das Teil recht ordentlich.
Wenn ich es halbwegs zurecht gefummelt habe werde ich ein Muster mal hier reinstellen.

Bembel