EXIF-Tag

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ERSC.

    Hallo,

    nachdem ich mir in VB ein kleines Programm geschrieben habe, mit dem ich meine Bilder von der Kamerakarte etwas bearbeiten und dann einsortieren kann (... ich weiß, gibt es zuhauf... aber selber macht mehr Spass) bleibt mir dazu noch ein kleines Problem überig.

    Zuerst hatte ich das Problem, wenn ich ein Bild mit .RotateFlip gedreht und dann abgespeichert habe, daß es mit anderen Bildbetrachtern (die auf die EXIF-Daten zugreifen) nicht oder falsch gedreht dargestellt wird. Dieses Problem konnte ich lösen indem ich die EXIF-Tags des Bildes (0x274 [Orientation Image] und 0x5029 [Orientation Thunbnail] nach dem Rotieren angepasst habe.

    Wenn ich mir nun in anderen Bildbetrachtern das Bild anschauen möchte, so erscheint das Vorschaubild bei manchen immer noch nicht gedreht aber das Bild wird dann beim Aufruf "richtig" (gedreht) angezeigt.
    (... im OpenFileDialog wird auch das Vorschaubild richtig angezeigt)

    Wenn ich mir im XnViev die EXIF-Daten anschaue erscheint noch ein Tag "Rotation Rotate 270 CW" ... und da vermute ich liegt mein Problem.


    Nun ist meine Frage an Euch, ob mir jemand sagen kann, um welchen EXIF-Tag [ImagePropertyTag] handelt sich mit dieser Angabe? (Tag.ID?)

    Ich weiß, es ist eine sehr spezielle Frage... aber vielleicht hat sich ja schon jemand damit beschäftigt und/oder kennt sich mit EXIF aus.

    Gruß
    ERSC
    Nun ist meine Frage an Euch, ob mir jemand sagen kann, um welchen EXIF-Tag [ImagePropertyTag] handelt sich mit dieser Angabe? (Tag.ID?)

    Du kannst dir selbst ein Programm schreiben, das dir diese Informationen ausgibt:
    Hier findest du Beispielcode: msdn.microsoft.com/de-de/libra…yitems%28v=vs.110%29.aspx
    Hallo Infinity,

    ... danke für die Antwort. Die "Analyse" der im Bild hinterlegten EXIF-Tags auf diese Art habe ich schon hinter mir...

    ...nur bisher konnte ich noch keinen logischen Zusammenhang erkennen, der mich zu dem gesuchten Tag führt. Ich habe auch schon die im Bild vorkommenden Tag-IDs mit "EXIF-Tabellen" verglichen... leider auch ohne "logischen" Erfolg.

    Wird wohl darauf hinauslaufen die vorhandenen Tags mit irgendetwas Definiertem zu überschreiben und dann schauen bei welcher Tag-ID "Rotation" überschrieben wird.
    Hallo,

    Meine Vermutung war leider falsch...

    ... viele vergebliche Versuche weiter, und mit der Erkenntnis, daß es an den EXIF-Tag-Werten für das [EXIF]- Thunbnail liegt, mal noch die Frage, ob jemand eine Methodik kennt (oder eine Idee dazu hat), mit der man ein Bild drehen kann und die EXIF-Thumbmail-Werte werden richtig mitgezogen.
    Nun ist meine Frage an Euch, ob mir jemand sagen kann, um welchen EXIF-Tag [ImagePropertyTag] handelt sich mit dieser Angabe? (Tag.ID?)

    Auf Seite 18 der Exif Spezifikation findest du Tag-Id, Type und mögliche Werte des "Orientation"-Tags.
    Spezifikation: exif.org/Exif2-2.PDF

    In der Spezifikation ist zwar die Rede von Thumbnails, allerdings nicht im Bezug auf das Orientation-Tag. Das Orientation-Thumbnail-Tag (dessen Id du auch im ersten Post schreibst) kann ich nicht in der Spezifikation finden (es kann natürlich trotzdem inoffiziell von machen Programmen verwendet werden).

    Dieses Problem konnte ich lösen indem ich die EXIF-Tags des Bildes (0x274 [Orientation Image] und 0x5029 [Orientation Thunbnail] nach dem Rotieren angepasst habe.

    Vielleicht hast du hier einen Fehler gemacht (wie bist du denn dabei vorgegangen?). Beachte auch, dass die erste Id in der Form wie du sie angibst, nicht im Hexdezimalsystem, sondern im Dezimalsystem lauten würden (den "0x"-Prefix kannst du also weglassen - oder die Zahlen ins Hexdezimalsystem umrechnen).

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

    Hallo Infinity,
    Vielleicht hast du hier einen Fehler gemacht (wie bist du denn dabei vorgegangen?). Beachte auch, dass die erste Id in der Form wie du sie angibst, nicht im Hexdezimalsystem, sondern im Dezimalsystem lauten würden (den "0x"-Prefix kannst du also weglassen - oder die Zahlen ins Hexdezimalsystem umrechnen).
    sorry, war ein Schreibfehler von mir, hier. Es geht um die beiden Tags 0x0112 [274.dez] Image Orientation und 0x5029 [20521.dez] Thunbnail Orientetion.

    Wenn ich mir die beiden Tags in XnView anzeigen lasse, haben sie unterschiedliche Werte, und deshalb bin ich auf die Idee gekommen, daß das Vorschaubild deshalb nicht gedreht dargestellt wird.

    Also habe ich den Versuch gemacht, die Orientierung das Vorschaubildes gleich der Orientierung des Bildes zu setzen.


    Du hast insoweit recht, als daß der Tag 'Thunbnail Orientetion' nicht in der EXIF2-2 Spezifikation (exif.org ist auch meine Quelle) auftritt. (... ich habe ihn mir ergoogelt)

    ... und wie es aussieht wird dieser Tag (zumindest im XnView und im IrfanView) nicht weiter ausgewertet, denn egal, wie ich ihn ändere, es passiert nichts.
    (Bezogen auf den Tag "Image Orientation" kann ich die Darstellung des Bildes schon ändern)

    Meine Vorgehensweise war eigentlich ganz einfach.
    Im IrfanView kann ich einstellen, ob als Vorschaubild das EXIF-Thumbnail (falls vorhanden) genommen werden soll. Ich habe also bei Bildern, deren Vorschaubild falsch dargestellt wird, diese Option herausgenommen... dann wird es aus dem Bild abgeleitet und wird richtig dargestellt (wie anscheinend auch im OpenFileDialog)

    Wenn ich nun in XnView oder IrfanView das Bild drehe und abspeichere, wird auch das Vorschaubild (wenn es aus dem EXIF-Thunbnail abgeleitet wird) richtig angezeigt. Wenn ich das Bild in VB drehe, wird nur das Bild richtig angezeigt, das Vorschaubild (wenn es aus dem EXIF-Thunbnail abgeleitet wird) nicht.

    Also muß ich daraus schließen, daß mir in VB noch etwas fehlt... ich weiß nur nicht was.
    Hallo,
    ... da ich Antwort erhalten habe, halte ich es für fair, meine (derzeitige) Lösung zu zeigen.
    Ich habe einen Code gefunden mit dem man das EXIF-Thunbnail überschreiben kann. Also mache ich mir vom gedrehten Bild ein eigenes Thunbnail und schreibe dies in die EXIF-Daten.
    ... nicht unbedingt elegant, aber es geht...

    Erstellen des Thumbnails:

    VB.NET-Quellcode

    1. Dim MS As New MemoryStream()
    2. Dim bild1t As New Bitmap(Image_Resize(bild1, 120))
    3. bild1t.Save(MS, ImageFormat.Jpeg)
    4. bild1t.Dispose()
    5. MS.Position = 0
    6. Dim smallthumbbytes As Byte() = MS.ToArray()
    7. BO1(FName, 1, 20507, smallthumbbytes)
    8. BO1(FName, 3, 20515, New Byte() {6, 0})


    Schreiben in EXIF-Tag:

    VB.NET-Quellcode

    1. Private Sub BO1(ByVal FileLoc As String, ITyp As Short, IID As Integer, Ivalue As Byte())
    2. Try
    3. Dim imgFile As FileStream = New FileStream(FileLoc, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    4. Dim fileBytes(CInt(imgFile.Length)) As Byte
    5. imgFile.Read(fileBytes, 0, fileBytes.Length)
    6. imgFile.Close()
    7. Dim MS As MemoryStream = New MemoryStream(fileBytes)
    8. Dim TheImage As Image = Image.FromStream(MS)
    9. Dim AllProperties() As PropertyItem = TheImage.PropertyItems
    10. Dim PropItem As PropertyItem = AllProperties(0)
    11. PropItem.Type = ITyp
    12. PropItem.Id = IID
    13. PropItem.Len = Ivalue.Length
    14. PropItem.Value = Ivalue
    15. TheImage.SetPropertyItem(PropItem)
    16. TheImage.Save(FileLoc)
    17. MsgBox("Save BO1 successful", MsgBoxStyle.Information, "Photo Metadata")
    18. imgFile.Close()
    19. Catch ex As Exception
    20. MsgBox(Err.Description, MsgBoxStyle.Information, "Photo Metadata")
    21. End Try
    22. GC.Collect()
    23. End Sub