Dateimetadaten Kommentar ändern

  • VB.NET
  • .NET 4.5

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    Neu

    Hallo, hatte leider zwei Tage keine Zeit und dann finde ich folgendes im Forum

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub MetaDataEditor()
    2. If Me.Halt Then Exit Sub
    3. If IO.File.Exists(Me.TempDatei) Then IO.File.Delete(Me.TempDatei)
    4. Me.Quelldatei = Me.QuellPfad & Me.DGV_Quelldaten.CurrentRow.Cells("Dateiname").Value.ToString
    5. Dim createOptions As BitmapCreateOptions = BitmapCreateOptions.PreservePixelFormat Or BitmapCreateOptions.IgnoreColorProfile
    6. Dim paddingAmount As UInteger = 2048
    7. ' 2Kb padding for this example, but really this can be any value.
    8. ' Our recommendation is to keep this between 1Kb and 5Kb as most metadata updates are not large.
    9. ' High level overview:
    10. ' 1. Perform a lossles transcode on the JPEG
    11. ' 2. Add appropriate padding
    12. ' 3. Optionally add whatever metadata we need to add initially
    13. ' 4. Save the file
    14. ' 5. For sanity, we verify that we really did a lossless transcode
    15. ' 6. Open the new file and add metadata in-place
    16. Using originalFile As Stream = File.Open(Me.Quelldatei, FileMode.Open, FileAccess.Read)
    17. ' Notice the BitmapCreateOptions and BitmapCacheOption. Using these options in the manner here
    18. ' will inform the JPEG decoder and encoder that we're doing a lossless transcode operation. If the
    19. ' encoder is anything but a JPEG encoder, then this no longer is a lossless operation.
    20. ' ( Details: Basically BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile
    21. ' tell the decoder to use the original image bits and BitmapCacheOption.None tells the decoder to wait
    22. ' with decoding. So, at the time of encoding the JPEG encoder understands that the input was a JPEG
    23. ' and just copies over the image bits without decompressing and recompressing them. Hence, this is a
    24. ' lossless operation. )
    25. Dim original As BitmapDecoder = BitmapDecoder.Create(originalFile, createOptions, BitmapCacheOption.None)
    26. If Not original.CodecInfo.FileExtensions.Contains("jpg") Then
    27. MsgBox("The file you passed in is not a JPEG.")
    28. 'Return
    29. End If
    30. Dim output As New JpegBitmapEncoder()
    31. ' If you're just interested in doing a lossless transcode without adding metadata, just do this:
    32. 'output.Frames = original.Frames;
    33. ' If you want to add metadata to the image using the InPlaceBitmapMetadataWriter, first add padding:
    34. If original.Frames(0) IsNot Nothing AndAlso original.Frames(0).Metadata IsNot Nothing Then
    35. ' Your gut feel may want you to do something like:
    36. ' output.Frames = original.Frames;
    37. ' BitmapMetadata metadata = output.Frames[0].Metadata as BitmapMetadata;
    38. ' if (metadata != null)
    39. ' {
    40. ' metadata.SetQuery("/app1/ifd/PaddingSchema:Padding", paddingAmount);
    41. ' }
    42. ' However, the BitmapMetadata object is frozen. So, you need to clone the BitmapMetadata and then
    43. ' set the padding on it. Lastly, you need to create a "new" frame with the updated metadata.
    44. Dim metadata As BitmapMetadata = TryCast(original.Frames(0).Metadata.Clone(), BitmapMetadata)
    45. ' Of the metadata handlers that we ship in WIC, padding can only exist in IFD, EXIF, and XMP.
    46. ' Third parties implementing their own metadata handler may wish to support IWICFastMetadataEncoder
    47. ' and hence support padding as well.
    48. metadata.SetQuery("/app1/ifd/PaddingSchema:Padding", paddingAmount)
    49. metadata.SetQuery("/app1/ifd/exif/PaddingSchema:Padding", paddingAmount)
    50. metadata.SetQuery("/xmp/PaddingSchema:Padding", paddingAmount)
    51. metadata.Title = "Das ist der Titel"
    52. metadata.SetQuery("System.Keywords", "Das ist eine Markierung")
    53. metadata.SetQuery("System.Author", "Ich bin der Autor von diesem Foto")
    54. metadata.Copyright = "Das ist das Copyrigh von dem Foto"
    55. metadata.Comment = "Der Kommentar"
    56. metadata.Rating = CInt("5")
    57. ' Create a new frame identical to the one from the original image, except the metadata will have padding.
    58. ' Essentially we want to keep this as close as possible to:
    59. ' output.Frames = original.Frames;
    60. output.Frames.Add(BitmapFrame.Create(original.Frames(0), original.Frames(0).Thumbnail, metadata, original.Frames(0).ColorContexts))
    61. End If
    62. Using outputFile As Stream = File.Open(Me.TempDatei, FileMode.Create, FileAccess.ReadWrite)
    63. output.Save(outputFile)
    64. End Using
    65. End Using
    66. ' For sanity, let's verify that the original and the output contain image bits that are the same.
    67. Using originalFile As Stream = File.Open(Me.Quelldatei, FileMode.Open, FileAccess.Read)
    68. Dim original As BitmapDecoder = BitmapDecoder.Create(originalFile, createOptions, BitmapCacheOption.None)
    69. Using savedFile As Stream = File.Open(Me.TempDatei, FileMode.Open, FileAccess.Read)
    70. Dim output As BitmapDecoder = BitmapDecoder.Create(savedFile, createOptions, BitmapCacheOption.None)
    71. End Using
    72. End Using
    73. IO.File.Delete(Me.Quelldatei)
    74. Rename(Me.TempDatei, Me.Quelldatei)
    75. End Sub




    Funktioniert im Testlauf. Denke ich werde es ein wenig anpassen und dann in mein Projekt so übernehmen.
    Gruß Markus

    Neu

    Westerwälder schrieb:

    dann finde ich folgendes im Forum
    Gib mal die Quelle dazu an.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    Neu

    Habe mir mal meine Dateien angeschaut, welche ich gerne ändern würde.
    Ausgenommen von PDF-Dateien haben alle (Excel, Word, MP3) die Tags
    Titel und Kommentar.
    Da ich nur diese beiden Tags ändern möchte (alle andere Einträge interessieren micht nicht), kann man dies nicht standardisieren?
    Eine Script- oder Batchlösung wäre mir auch recht.
    Gruß Markus

    Neu

    Hallo und Frohe Pfingsten

    Bin nun bei Worddokumenten angekommen.

    VB.NET-Quellcode

    1. Public Sub Setzen(ByVal WordPfad As String, ByVal WordDatei As String,
    2. ByVal MetaTitel As String, ByVal MetaKommentar As String)
    3. If Not WordPfad.EndsWith("\") Then WordPfad = WordPfad & "\"
    4. Me.QuellDatei = WordPfad & WordDatei
    5. If Not IO.File.Exists(Me.QuellDatei) Then
    6. MessageBox.Show("Die Worddatei " & Me.QuellDatei & " existiert nicht.", Me.MessTitel, MessageBoxButtons.OK, MessageBoxIcon.Hand)
    7. Exit Sub
    8. End If
    9. Dim Worddokument As Package = Package.Open(Me.QuellDatei, FileMode.Open, FileAccess.ReadWrite)
    10. With Worddokument.PackageProperties
    11. .Title = MetaTitel
    12. .Subject = MetaKommentar
    13. End With
    14. ' Speichern der geänderten Eigenschaften in der Datei
    15. End Sub

    Leider gibt es keinen Package.Save oder ähnliches.
    Gruß Markus

    Neu

    Für Office Word habe ich nun eine Lösung:

    VB.NET-Quellcode

    1. Public Sub Setzen(ByVal WordPfad As String, ByVal WordDatei As String,
    2. ByVal MetaTitel As String, ByVal MetaKommentar As String)
    3. If Not WordPfad.EndsWith("\") Then WordPfad = WordPfad & "\"
    4. Me.QuellDatei = WordPfad & WordDatei
    5. If Not IO.File.Exists(Me.QuellDatei) Then
    6. MessageBox.Show("Die Worddatei " & Me.QuellDatei & " existiert nicht.", Me.MessTitel, MessageBoxButtons.OK, MessageBoxIcon.Hand)
    7. Exit Sub
    8. End If
    9. Dim WordApp As New Word.Application
    10. Dim WordDokument As New Word.Document
    11. WordDokument = WordApp.Documents.Open(Me.QuellDatei.ToString)
    12. With WordDokument
    13. .BuiltInDocumentProperties("Title").value = MetaTitel
    14. .BuiltInDocumentProperties("Subject").value = MetaKommentar
    15. .BuiltInDocumentProperties("Comments").value = MetaKommentar
    16. .BuiltInDocumentProperties("Company").value = Programm.Copyright_Kurz
    17. End With
    18. WordDokument.Save()
    19. WordApp.ActiveDocument.Close()
    20. WordApp.Quit()
    21. WordDokument = Nothing
    22. End Sub

    Hier musste ich Option Strict Off setzen.
    Gruß Markus