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:
(http://roemer.li/bild-529.jpg)
Schöne Geschichte will ich meinen und vielleicht hat ja der eine oder andere Bedarf.
Viele Grüße
Andi
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 (http://www.access-o-mania.de/forum/index.php?topic=11580.msg63685#msg63685)
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 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? :-\
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?
Andi,
wie war das nochmal mit den Bienen und den Blumen? Hatte da irgendwas in Erinnerung ...;-)
Ansonsten danke für deine Infos.
Andreas
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
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.
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.
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.
:)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
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
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
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.
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
Ich gebs auf. Mit GDIP funktioniert es in einer Schleife. Aber nur einmal. Wenn ich die Datenbank schließe und wieder aufmache funktioniert es nicht mehr. Die Variable "m_pimage", die ist ein Long-Wert, hat immer den Wert 0 und es wird nichts angezeigt.
Keine Ahnung wie man den auf den korrekten Wert kriegt.
Bembel
Hallo
um dir ggf. helfen zu können solltest du evtl. mal zeigen was du genau machst.
Danke für das Angebot. Leider habe ich erst am Wochenende wieder Zeit mich damit zu befassen. Dann stelle ich mal meine .mdb und eine ausführliche Problembeschreibung hier rein.
Ich habe den Thread irgendwie anders in Erinnerung. Da waren noch etliche andere Beiträge drin. Allerdings schon vor längerer Zeit geschrieben.
Bis bald
Bembel