Laden...

"Titel" in die Metadaten einer Bilddatei schreiben

Letzter Beitrag vor 2 Jahren 13 Posts 786 Views
"Titel" in die Metadaten einer Bilddatei schreiben

Ich möchte in einer Bilddatei den Titel schreiben.
Das ist dann simpel, wenn die Bilddatei bereits einen (nicht leeren) Titel hat.
Wenn das nicht der Fall ist, gibt es in der Property-Liste kein Element "PropertyTagImageDescription" (ID 270).
Aber natürlich besitzt die Bilddatei den "Titel" - nur eben leer.
In der Windows-Oberfläche kann man in den Eigenschaften dieser Datei natürlich manuell einen Titel eintragen (die leere Eigenschaft existiert).
Dann erscheint er auch in der Property-Liste.
Das Problem ist, dass die PropertyItem Klasse nicht über einen definierten Public Konstruktor verfügt und man also keine Instanz eines PropertyItem Objekts erstellen kann.
So kann man im Programm auch das Titel-Property nicht hinzufügen.

Obwohl ich intensiv suche, finde ich einfach keine Lösung dafür.
Hat bitte jemand eine Idee, wie man (in meinem Fall) den (bisher leeren) Titel schreiben kann?

Naja, es gibt bestimmt hunderte von Bibliotheken die es erlauben EXIF Daten in Bildern zu pflegen.
Es ist nicht alle im Framework/Core enthalten.

Ich habe aber bisher leider keine gefunden (vgl. Anhang)...
Hast Du ggf. nur ein passendes Beispiel?

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF


>


>

Hallo Wilfried,
vielen Dank für die Links und vor allem für die netten Anmerkungen. Vor allem die helfen wirklich!

Die Anmerkungen stehen in meiner Signatur und sind allgemein gemeint.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

Sorry - das hatte ich wohl falsch verstanden.

Aber: Ich habe jetzt die meisten Pakete, die ich unter den Links fand, angesehen.
Eine Lösung meines Problems habe ich dabei nicht gefunden.
Lesen der Metadaten können alle - das kann ich aber auch so.
Aber wie eines schreiben - vor allem, wenn es bisher leer war?
(Und das idealerweise noch, ohne dafür ein riesiges Paket installieren zu müssen...

Hat ggf. jemand ein sinnvolles Beispiel zur BitmapMetadata.SetQuery-Methode? Das (m.E. recht sinnlose) Beispiel in der Hilfe (pngInplace.SetQuery("/Text/Description", "Have a nice day.")😉 bringt mich auch nicht weiter. Kann man die nicht verwenden?

Danke für Eure Hilfe!

Hast du schon ExifLibrary ausprobiert? Das Beispiel sieht doch sehr einfach zu verwenden aus (s.a. Properties).

Ja, das hatte ich.
Gerade habe ich aber gesehen, dass das eine veraltete Version war.
Mit der aktuellen habe ich es jetzt nach x Versuchen hinbekommen.
Jetzt kommt leider schon die nächste Aufgabe:
Viele Kameras machen jetzt .heic-Bilder.
Die haben zwar zum großen Teil auch die gleichen Eigenschaften (z.B. Copyright) - nur das kann das Tool (noch) nicht.
... eine endlose Geschichte.

Trotzdem erstmal vielen Dank. Es ist ja zumindest der Anfang.

.heic-Dateien sind (noch) kein Standard im .NET-Umfeld.
Es gibt eine proprietäre Lösung: Manage XMP and EXIF Data of HEIF/HEIC Images using C#
Oder aber du benutzt das Kommandozeilentool ExifTool (es gibt wohl auch .NET Wrapper dafür, s. unter Additional Documentation and Resources/Related Utilities/Programming).

PS: Bei der ExifLibrary gibt es bisher nur ein offenes Issue: Reading and writing HEIF image format metadata

@TH69:
Ganz vielen Dank für den Tipp!
Das Tool hat mir schon mal sehr geholfen. So langsam werde ich Lösungen finden.

Hast Du ggf. auch Erfahrungen mit dem WindowsAPICodePack?
Das arbeitet auch ganz ok, aber hier habe ich einen komischen Effekt:
Ich kann z.B. in eine mp4-Datei folgendes Property schreiben:
ShellPropertyWriter propertyWriter = file.Properties.GetPropertyWriter();
propertyWriter.WriteProperty(SystemProperties.System.Title, "TestText");
propertyWriter.Close();
Erstmal fällt auf, dass der "TestText" nicht im Titel angezeigt wird.
Aber er wird am File angetragen, was eine Abfrage mit "exiftool -Title" zeigt. Da wird genau dieser Text zurückgegeben.
Er steht also wohl irgendwo anders.
Das wäre ja nicht so tragisch (für das, was ich machen möchte).
Aber er lässt sich über die Shell nicht wieder abfragen. Da steht NULL drin (file.Properties.System.Title.Value)
... sehr verrückt.

Schön, daß es dir geholfen hat - habe aber auch nur die Internet-Suche benutzt. 😉

Wieso jetzt denn "mp4" (also eine Video-Datei)? Du kannst nicht erwarten, daß jedes Format die Tags unterstützt, s.a. ExifTool Tag Names

Mit dem "WindowsAPICodePack" habe ich auch nicht viel Erfahrung.
Hast du denn nach dem Speichern die Datei wieder neu eingeladen bevor du file.Properties.System.Title aufgerufen hast?

Erst nochmal vielen Dank für die Hilfe!

Ich habe das Problem jetzt gelöst.
Für die Grafikdatein (geht für jpg genauso wie z.B. für heic) nutze ich jetzt den ShellPropertyWriter zum schreiben bzw. IShellProperty zum lesen.
Beide sind aus dem WindowsAPICodePack.
Das geht gut und schnell.
Für die Videos (mp4) geht zum schreiben ebenfalls ShellPropertyWriter gut. Leider funktioniert hier aber das Lesen nicht so simple (IShellProperty gibt nur NULL zurück; Warum auch immer.).
Dazu habe ich deshalb eine Funktion implementiert, die das mittels des ExifTool (https://exiftool.org/) erledigt. Das ist etwas langsamer, funktioniert aber auch gut.

Nochmal danke!