Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
"Titel" in die Metadaten einer Bilddatei schreiben
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 62
Herkunft: Dresden

Themenstarter:

"Titel" in die Metadaten einer Bilddatei schreiben

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10.000

beantworten | zitieren | melden

Naja, es gibt bestimmt hunderte von Bibliotheken die es erlauben EXIF Daten in Bildern zu pflegen.
Es ist nicht alle im Framework/Core enthalten.
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 62
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

Ich habe aber bisher leider keine gefunden (vgl. Anhang)...
Hast Du ggf. nur ein passendes Beispiel?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von visionmaster am .
Attachments
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 173
Herkunft: Radeberg

beantworten | zitieren | melden

https://www.nuget.org/packages?q=exif
https://github.com/search?q=exif
- 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
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 62
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

Zitat von Wilfried
https://www.nuget.org/packages?q=exif
https://github.com/search?q=exif


Hallo Wilfried,
vielen Dank für die Links und vor allem für die netten Anmerkungen. Vor allem die helfen wirklich!
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 173
Herkunft: Radeberg

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 62
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.594

beantworten | zitieren | melden

Hast du schon ExifLibrary ausprobiert? Das Beispiel sieht doch sehr einfach zu verwenden aus (s.a. Properties).
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 62
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.594

beantworten | zitieren | melden

.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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 62
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.594

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 62
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers