[VB] VB6 Erstellungsdatum Bilddatei

piggiCH

Stammgast
Hallo VB6 Creeks

Wie extrahiere ich in VB6 das Erstellungsdatum einer Bilddatei (JPG) die mit einer Digitalkamera aufgenommen wurde. Bin gespannt.
 
A

abu

Guest
Meinst du das Erstelldatum der JPG-Datei oder das "echte" Aufnahmedatum aus den EXIF-Daten?
 

piggiCH

Stammgast
EXIF Reader

Hallo Abu

ich habe nun das Teil (Class) in meine Programm eingebaut. Er zeigt mir auch das richtige Datum und Zeit an. Aber nur bei der ersten Datei (vgon 15), die in einem Ordner gespeichert sind. Beim Zugriff auf die zweite Datei steigt die Klasse aus (indexproblem). Falls Du Erfahrung damit hast, schau Dir die Bilder an. Besten Dank im Voraus. Piggi.
 
A

abu

Guest
Welche Bilder? Poste mal den betreffenden Teil deines VB-Codes.
 

piggiCH

Stammgast
Exif

Die Bilder waren zu gross, aber falls Du VB6 besitzt, kannst du das gesamte Programm (Source) auf meiner HP downloaden.

http://www.piggi.ch/helpdown.htm

lade dort GetFileInformation, dort unter Form1 (SUB HoleFileInformation) JPG suchen.
Ich hoffe, ich mache Dir nicht zu viel Mühe. Piggi
Code:
Public Sub HoleFileInformation
  On Error Resume Next
  
  Dim objExif As New ExifReader
  Dim txtExifInfo As String
  
  Dim hFile As Long
  Dim Retval As Long
  Dim CTime As FILETIME
  Dim STime As SYSTEMTIME
  Dim ATime As FILETIME
  Dim BTime As FILETIME
  Dim Dummi As FILETIME
  Dim OF As OFSTRUCT
  Dim LowSize As Long
  Dim HighSize As Long
  Dim MyLowSize As Long
  Dim sHelp As String
  
  ' Datei öffnen (nicht Erstellen, falls nicht vorhanden)
  hFile = CreateFile(MyDirFile, GENERIC_READ, FILE_SHARE_READ, _
    ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&)

  If hFile = -1 Then
    Select Case MyLanguage
    Case "D"
    sHelp = "Datei nicht vorhanden, wird ignoriert!"
    Case "F"
    sHelp = "Fichier pas disponible, ignoré!"
    Case "I"
    sHelp = "File non ottenibile, ignored!"
    Case "E"
    sHelp = "File not available, ignored!"
    End Select
    MsgBox sHelp, vbOKOnly + vbInformation, "GetFileInformation"
    Exit Sub
  End If
  
  ' Erstellungsdatum ermitteln
  GetFileTime hFile, CTime, ATime, BTime
    
  ' Konvertieren nach "Lokale Zeitzone"
  FileTimeToLocalFileTime BTime, BTime

  ' In Systemzeit umwandeln
  FileTimeToSystemTime BTime, STime
  
  'Öffnet die Datei
   OF.cBytes = Len(OF)
   hFile = OpenFile(MyDirFile, OF, OF_READ)
   If hFile = 0 Then
      Exit Sub
   End If

  ' Ermitteln der Dateigröße
    LowSize = GetFileSize(hFile, HighSize)
    CloseHandle hFile
    
    MyFilePrint = MyFile
      
  ' ermitteln der Bildabmessungen
    
    Select Case LCase$(Right$(MyFile, 3))
    
       Case "bmp", "jpg", "gif", "wmf"
       If GetPictureSize(MyDirFile, nWidth, nHeight) = False Then
          MsgBox "Fehler... " & "Evtl. wurde ein ungültiger Bildpfad angegeben.", vbOKOnly, "RenamePictures"
       End If
    End Select
    CloseHandle MyDirFile
  
  ' ermitteln Aufnahmedateum und Zeit wenn JPG-Bild
          
    Select Case LCase$(Right$(MyFile, 3))
       Case "jpg"
       objExif.Load MyDirFile
       txtExifInfo = objExif.Tag(DateTimeOriginal)
       MsgBox txtExifInfo
    End Select
 
Zuletzt bearbeitet von einem Moderator:
A

abu

Guest
Sorry, ich mag keine fremden EXE laden und installieren. Du könntest versuchen, mir genauer zu umschreiben, wo der Fehler passiert. Im obigen Code sehe ich auf de Schnelle nichts wirklich Verdächtiges.

Wie sieht der Code aus, der die Files durch iteriert? Das EXIF-Auslesen scheint ja zu klappen.
 

piggiCH

Stammgast
EXIF Reader

Ich arbeite ein FileList durch von der aus ich die FileNames (Pfad), an den exitReader übergebe.
Nun ist aber nach dem erste File Schluss. Der zweite FileName wird richtig übergeben.

und hier in der Klasse steigt er aus:
Code:
                        Case m_RATIONAL, m_SRATIONAL
                            BytesPerComponent = 8
                            .Offset_To_Value = _
                                ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
                                ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
                                ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                                ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)

ab hier ist gelb markiert im VB
                           .Value = _
                                ExifTemp(Offset_to_TIFF + .Offset_To_Value + 3) * 256& * 256& * 256& + _
                                ExifTemp(Offset_to_TIFF + .Offset_To_Value + 2) * 256& * 256& + _
                                ExifTemp(Offset_to_TIFF + .Offset_To_Value + 1) * 256& + _
                                ExifTemp(Offset_to_TIFF + .Offset_To_Value + 0) & _
                                "/" & _
                                ExifTemp(Offset_to_TIFF + .Offset_To_Value + 7) * 256& * 256& * 256& + _
                                ExifTemp(Offset_to_TIFF + .Offset_To_Value + 6) * 256& * 256& + _
                                ExifTemp(Offset_to_TIFF + .Offset_To_Value + 5) * 256& + _
                                ExifTemp(Offset_to_TIFF + .Offset_To_Value + 4)
bis hier                            
                    End Select
 
Zuletzt bearbeitet von einem Moderator:

piggiCH

Stammgast
Bilder zu EXIF

Hier die Meldung vom ersten und Zweiten Bild das erholen sollte. (Meldung: Ueberlauf)

schein keine Index-Problem zu sein. Gruss Piggi
 
Zuletzt bearbeitet:
A

abu

Guest
Das sagt mir jetzt nichts. Ev. liegt der Fehler komplett an einem anderen Ort. Die Tatsache, dass der erste Durchlauf geht und erst der zweite Durchlauf crasht, deutet schon auf sowas hin.

Ich werde morgen wenn möglich mal versuchen, dein Setup auf einem Test-PC zu installieren. Danach sehe ich (hoffentlich) mehr.
 

piggiCH

Stammgast
Exif

Das ist ein tolles Angebot, kannst mir einen Einzahlungsschein schicken wenn das klappt.

Grus Piggi
 
A

abu

Guest
Ganz schön mutig. Du kennst meine Tarife ja gar nicht. ;)
 

piggiCH

Stammgast
Komisch

Hallo Abu
Zum Testen habe ich nun 20 Bilder mit meiner HP-R817 gemacht und diese in einem Ordner gespeichert. Und siehe da, EXIF funktioniert einwandfrei. Könnte es sein, das das Klassenmodul aussteigt, wenn kein Aufnahme-Datum vorhanden ist? Ist aber nicht mehr relevant, da es ja jetzt funktioniert. Vielen Dank für Deine Bemühungen. Piggi
 
A

abu

Guest
Könnte es sein, das das Klassenmodul aussteigt, wenn kein Aufnahme-Datum vorhanden ist?

Genauso ist es.

Hier nun trotzdem meine Lösung. Es hat etwas länger gedauert, da ich gestern zu wenig Zeit hatte.

Die gute Nachricht vorweg: Das Programm funktioniert schon, allerdings schmiert es ab, wenn ein JPG-File keine EXIF-Daten enthält. Dies ist bei den Bildern die du für den Test verwendet hast leider der Fall. Wird das Programm auf Bilder mit EXIF-Daten losgelassen, ist alles OK. Dies muss vorab erkannt werden. Dazu habe ich Folgendes gemacht.

File ExifReader

Hier habe ich die Variable IsLoaded Public gemacht. Die Methode Load setzt die auf True, wenn das File gültig ist. Wenn sie jedoch wie im Original-Code Private ist, kann man sie ja nicht abfragen. Eigentlich mache ich solche Sachen höchst ungern, es gäbe bestimmt elegantere bzw. bessere Wege dies zu tun.

Code:
' *** begin abu ***
' Private
Public IsLoaded As Boolean 
' *** end abu ***


File GetFileInformation


Hier habe ich eine If Abfrage um der Aufruf vonobjExif.Tag(DateTimeOriginal) gelegt und deine MsgBox in diese Abfrage verschoben. Ein zusätzlicher Test auf "" verhindert eine leere MsgBox im Falle von fehlenden EXIF-Daten.

Code:
' *** begin abu ***
If objExif.IsLoaded Then
    txtExifInfo = objExif.Tag(DateTimeOriginal)
    If "" <> txtExifInfo Then
        MsgBox txtExifInfo
    End If
End If
' *** end abu ***
So, das reicht für mich, der Rest ist deine Aufgabe. Viel Spass beim weiteren Programmieren.

Ach ja, zwei Erganzungen bzw .Tipps von mir:

1. Dein Installer ist kaputt, die Deinstallation funktioniert nicht. Handarbeit ist angesagt. :(

2. Dass dein Programm ungefragt etwas auf den Drucker schickt ist ausgesprochen nervig. Sollte man abstellen können.
 
Zuletzt bearbeitet:

piggiCH

Stammgast
Oki EXIF

Sorry wegen dem Drucker, habe zum Test den Print des zu übergebenden Files gedruckt. Ist hier schon wieder draussen. Also vielen Dank.
 
Oben