Laden...

"Titel" in die Metadaten einer Bilddatei schreiben

Erstellt von visionmaster vor einem Jahr Letzter Beitrag vor einem Jahr 590 Views
V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor einem Jahr
"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?

F
10.010 Beiträge seit 2004
vor einem Jahr

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

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor einem Jahr

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

190 Beiträge seit 2012
vor einem Jahr
  • 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

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor einem Jahr


>


>

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

190 Beiträge seit 2012
vor einem Jahr

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

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor einem Jahr

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!

4.931 Beiträge seit 2008
vor einem Jahr

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

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor einem Jahr

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.

4.931 Beiträge seit 2008
vor einem Jahr

.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

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor einem Jahr

@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.

4.931 Beiträge seit 2008
vor einem Jahr

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?

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor einem Jahr

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!