Wie Exif Tags einlesen?

  • VB.NET

Es gibt 61 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @Bournout3000 Frag Frau Google nach .net Exif Tags auslesen
    Die ersten beiden Treffer:
    Exif1
    Exif2
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also irgendwie hat mir das leider überhaupt garnicht geholfen. Also ich hab einen Openfile Dialog und der läd den Pfad der Datei in eine Listbox. Ich will dass er mir in einer Richtextbox alles an Exif Tags ausgibt. Aber bei dem Teil mit dem Exif-Tags komme ich überhaupt nicht weiter. Ich hab schon viel gegoogled, weiß aber nicht was ich mit dem Code anfangen soll, bzw. was der Code tut und wie ich ihn richtig implementiere ?(
    @Bournout3000 Dann poste mal Deinen Code, wag, was er machen soll und sag, was er macht bzw. nicht macht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @Bournout3000 Dann poste mal Deinen Code, wag, was er machen soll und sag, was er macht bzw. nicht macht.

    ok also ich hab einen Openfile Dialog und einen Button zum öffnen dafür. Dann hab ich eine Richtextbox und eine Picturebox und eine Listbox. Im Code steht jetzt eig. nicht wirklich was, weil das ja eben nie geklappt hatte bzw. ich nie wusste wie ich das implementieren soll:

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Private Sub Readbtn_Click(sender As Object, e As EventArgs) Handles Readbtn.Click
    3. Using open As New OpenFileDialog
    4. open.Title = "Wähle eine Bilddatei aus:"
    5. open.FileName = ""
    6. open.Multiselect = True
    7. 'Ich lasse mehrere Dateien gleichzeitig öffnen,
    8. 'damit man zwischen verschiedenen Dateien auswählen kann die dann in der Listbox gelisted werden
    9. open.Filter = JPEG|*.jpeg|PNG|*.png||Alle Dateien|*.*"
    10. If open.ShowDialog = Windows.Forms.DialogResult.OK Then
    11. ListBox1.Items.AddRange(open.FileNames)
    12. Next
    13. End If
    14. End Using
    15. End Sub
    16. Private Sub ListBox1_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedValueChanged
    17. 'Leere den Richtextbox Inhalt wieder
    18. RichTextBox1.Clear()
    19. PictureBox1.ImageLocation = ListBox1.SelectedItem
    20. End Sub
    21. End Class
    @Bournout3000 Du musst die Datei als Binary öffnen und denn Inhalt interpretieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Bournout3000 schrieb:

    was bedeuted das?
    Dass Du noch nicht gelernt hast, eine Suchfunktion zu benutzen (Forum und Google).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die EXIF-Daten befinden sich in einem Bitmap-Objekt unter der Eigenschaft PropertyItems. Das ist ein Array von PropertyItem. Ein PropertyItem stellt ein EXIF-Tag dar. Es enthält u.a. die Tag-ID, den Typ des Wertes und natürlich den Wert in Form von Byte-Array. Um den Wert richtig anzeigen zu können, musst Du den Typ abfragen und jenach Typ das Byte-Array für den Wert mit entsprechenden Methoden konvertieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xtts02“ ()

    xtts02 schrieb:

    Die EXIF-Daten befinden sich in einem Bitmap-Objekt unter der Eigenschaft PropertyItems. Das ist ein Array von PropertyItem. Ein PropertyItem stellt ein EXIF-Tag dar...
    Wie schaue ich das genau nach? In Visual Basic oder an einer Bild datei selbst? Warscheinlich ja in Visual Basic aber wo genau da?

    xtts02 schrieb:

    Die EXIF-Daten befinden sich in einem Bitmap-Objekt unter der Eigenschaft PropertyItems. Das ist ein Array von PropertyItem. Ein PropertyItem stellt ein EXIF-Tag dar. Es enthält u.a. die Tag-ID, der Typ des Wertes und natürlich der Wert in Form von Byte-Array. Um den Wert richtig anzeigen zu können, musst Du den Typ abfragen und jenach Typ das Byte-Array für den Wert mit entsprechenden Methoden konvertieren.

    Das was du von mir willst was ich da angeben soll. Wie ich das angebe
    @Bournout3000

    RodFromGermany schrieb:

    Dass Du noch nicht gelernt hast, eine Suchfunktion zu benutzen (Forum und Google).

    VB.NET-Quellcode

    1. Dim bmp = New Bitmap("C:\Temp\Test.png")
    2. Dim x() = bmp.PropertyItems()
    Bilder
    • EXIF.png

      16,76 kB, 387×278, 191 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    <p>

    RodFromGermany schrieb:

    @Bournout3000<br />
    &nbsp; &nbsp; &nbsp;

    VB.NET-Quellcode

    1. Dim bmp = New Bitmap("C:\Temp\Test.png")
    2. Dim x() = bmp.PropertyItems()
    </p>

    <p>ok soweit hab ich das jetzt auch dahingeschrieben, aber dieses Bild was da angeh&auml;ngt ist dass ich das so hinbekomme mit dem x{Length=30} und danach diese {System.Drawing.Imaging.PropertyItem}.... das bekomme ich nicht aufgerufen. Es sieht &auml;hnlich aus wie die IDE aber das scheint sie nicht zu sein.

    Bournout3000 schrieb:

    das bekomme ich nicht aufgerufen
    Haltepunkt auf eine Zeile drunter, Maus auf die zu begutachtende Variable und dann auf den richtigen Expander klicken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Visual Basic-Quellcode

    1. bmp.PropertyItems()
    so das hab ich jetzt debugged. Da kommen bei mir 55 {System.Drawing.Imaging.PropertyItem} davon kann ich die ID die Len, den Type und die Value pro property Item sehen. Aber erstmal wie finde ich heraus, was das dann sagt und wie gebe ich das dann genau aus?
    Ja, das ist eine Fleißarbeit und ein Geduldsspiel, ähnlich wie beim Auslesen von mp3-Tags.

    Die Definition der Tags findest Du exiv2.org/tags.html

    Jetzt mußt Du "nur" noch die Dich interessierenden ID's auswählen und in einer schönen Select Case aufbereiten.
    Und an den Wert der Property kommst Du mit

    VB.NET-Quellcode

    1. For Each Info As PropertyItem In Image.PropertyItems
    2. Select Case Info.Id
    3. Case 272 ' ID für Kameramodell
    4. Kamera = enc.GetString(Info.Value, 0, Info.Len - 1)
    5. Case 36867 ' ID für Aufnahmedatum
    6. cDatum = enc.GetString(Info.Value, 0, Info.Len - 1)
    7. Case ...
    8. etc.
    9. End Select
    10. Next

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „us4711“ ()

    Hier ein Beispiel mit ein paar Methoden, um die Value-Byte-Array zu parsen. Hoffe, dass es auch ohne Kommentar verständlich ist.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Using dlg As New OpenFileDialog
    5. dlg.Filter = "JPEG Bilder (*.jpg)|*.jpg"
    6. If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then
    7. Me.DisplayExifInfo(dlg.FileName)
    8. End If
    9. End Using
    10. End Sub
    11. Private Sub DisplayExifInfo(filename As String)
    12. If Not IO.File.Exists(filename) Then Throw New IO.FileNotFoundException
    13. Dim sb As New System.Text.StringBuilder
    14. sb.AppendLine("DateTime: " & Now.ToString)
    15. sb.AppendLine("Filename: " & filename)
    16. sb.AppendLine("-- Properties: ")
    17. Using bmp As New Bitmap(filename)
    18. For Each prop In bmp.PropertyItems
    19. Dim value As String = String.Empty
    20. Select Case prop.Type
    21. Case Is = 2 ' ASCII
    22. value = prop.Value.GetString
    23. Case Is = 1, 3 ' Int16
    24. value = prop.Value.GetInt16.ToString
    25. Case Is = 4, 7 ' Int32
    26. value = prop.Value.GetInt32.ToString
    27. Case Is = 5, 10 ' Zahlenpaar, als Bruch dargestellt
    28. value = prop.Value.GetRational
    29. Case Else ' Unbekannt
    30. value = "Method not yet implemented for this type of data!"
    31. End Select
    32. Dim info = String.Format("ID: {0}, Type: {1}, Value: {2}", prop.Id, prop.Type, value)
    33. sb.AppendLine(info)
    34. Next
    35. End Using
    36. Dim exifInfoFilename = IO.Path.Combine(IO.Path.GetTempPath, IO.Path.GetFileNameWithoutExtension(filename) & ".txt")
    37. IO.File.WriteAllText(exifInfoFilename, sb.ToString, System.Text.Encoding.UTF8)
    38. Process.Start(exifInfoFilename)
    39. End Sub
    40. End Class
    41. Public Module ExifExtensions
    42. <Extension()> Public Function GetString(data() As Byte) As String
    43. Dim enc = System.Text.Encoding.Default
    44. Dim nullChar = Convert.ToChar(&H0)
    45. Dim result = enc.GetString(data)
    46. If result.EndsWith(nullChar) Then result = result.Substring(0, result.Length - 1)
    47. Return result
    48. End Function
    49. <Extension()> Public Function GetInt16(data() As Byte) As Int16
    50. Return BitConverter.ToInt16(data, 0)
    51. End Function
    52. <Extension()> Public Function GetInt32(data() As Byte) As Int32
    53. Return BitConverter.ToInt32(data, 0)
    54. End Function
    55. <Extension()> Public Function GetRational(data() As Byte) As String
    56. Dim numerator(3), denominator(3) As Byte
    57. Array.Copy(data, 0, numerator, 0, 4)
    58. Array.Copy(data, 4, denominator, 0, 4)
    59. Return String.Concat(numerator.GetInt32.ToString, "/", denominator.GetInt32.ToString)
    60. End Function
    61. End Module

    Die Tag-IDs muss man noch so implementieren, dass sie lesbar sind. Die Liste der Tags siehe Posting direkt drüber.
    Also ich hab das auch für ID3 Tags geschrieben aber nun will ich, dass es eben nur funktioniert auch mit diesen Exif Tags. Ich brauche das nämlich für die Schule als Projekt um etwas zu beweisen, aber dafür muss ich das erstmal zum laufen bringen. Ich hab versucht den Code oben einzuarbeiten aber ich bin mir nicht sicher warum es nichts macht bzw. eig. weiß ich nicht ganz genau was ich machen muss, dass es funktioniert. Daher poste ich einfach mal mein Projekt und ihr könnt es dann runterladen und sehen, wieso es nicht geht bzw. was fehlt. Weil ich bin um ehrlich zu sein etwas überfordert weil ich hauptsächlich die Grundkenntnisse so hab und hab leider seit einiger Zeit aus Zeitmangel kaum programmieren können, deswegen bin ich auch so überfordert damit und ich brauche das wirklich dringend also hier ist das Projekt: https://www.dropbox.com/sh/mj81qzahlyrhufq/luRjfya6hN
    oder auch direkt als ZIP dropbox.com/s/uy46q6e549pl0a6/ID3-Tag Exif-Tag Reader.zip

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bournout3000“ ()