Hallo zusammen
Ich will für meine Bildergallerie die Keywords (Markierungen) meiner Bilder (JPG) mittels C# automatisch setzten.
Sprich: Rechtsklick auf das Bild --> Eigenschaften --> Details --> Markierungen. Dieses Feld will ich auslesen und beschreiben.
Dazu gibt es im Internet viele Beispielcodes, welche auch funktionieren. Leider wird darin immer das Bild geladen und dann wieder gespeichert. Dadurch habe ich aber eine Bildveränderung, welche ich nicht will. Denn ich habe dabei teilweise eine Dateigrössenhalbierung, also Datenverlust.
Wie kann ich diese Einträge bearbeiten ohne das mein Bild verändert wird (jeder Pixel soll so bleiben wie er ist)?
Gruss
Black_Rider
So funktioniert leider EXIF nicht, daher kann diese Erwartungshaltung nicht erfüllt werden.
Um EXIF Informationen zu erhalten, muss das ganze Bild geladen werden.
Entsprechend muss bei einer Änderung auch das Bild wieder encoded werden, um dieses zu speichern.
Was Du also suchst ist eine Bibliothek, die zur Änderung (aller Metadaten, auch EXIF) das selbe Encoding verwendet.
Das Problem ist: Du kannst das Encoding nicht auslesen, daher weißt Du beim Schreiben nicht, was verwendet wurde.
Es ist ohne hellseherische Fähigkeiten unmöglich dies generisch umzusetzen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Abt
Vielen Dank für Deine Antwort.
Gut, dann anders:
Wie encode ich es beim speichern wieder gleich wie es war? Bzw. wie bringe ich das ganze ohne Qualitätsverlust hin?
Ich könnte auch noch alternativen verwenden. Unterstützt wird: EXIF, XMP und IPTC, falls das etwas bringt.
Gruss
Black_Rider
Wie bereits gesagt; nicht (so wirklich) möglich - zumindest nicht für die gängigen Bilddateien, da die Metadaten Teil des Bilds sind und nirgends das verwendete Encoding hinterlegt wird.
Du kannst Dir höchstens ne Bibliothek wie exiv2 suchen, die versucht das Encoding zu ermitteln - aber ich weiß aus Erfahrung, dass auch exiv2 nicht hellsehen kann.
Mit .NET Bitmap-Mittel keine Chance.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Schau dir mal ExifLibNet an.
Damit kann man die Exif-Metadaten von Bildformaten bearbeiten. Die eigentlichen Bild-Daten werden dabei nicht verändert; sprich, das Bild selbst bleibt unangetastet.
Gruß Jake
@Jake: korrigiere mal deinen Link.
Danke für den Hinweis. Ist korrigiert.
Hallo zusammen
Dankeschön für den Tipp mit ExifLibNet, jedoch ist hier das gleiche.
ImageFile data;
data = ImageFile.FromFile(Path_s);
data.Save(Path_d);
Bild von Path_s = 153 KB
Bild von Path_d = 117 KB
Gruss
Black_Rider
Mit ExifLibNet kannst du nur die EXIF-Daten ändern. Hast du mal die beiden Dateien miteinander verglichen, was sich da genau geändert hat?
Das ganze geht übrigens auch mit einem Trick mit dem normalen .NET Framework: Lossless JPEG Rewrites in C#
The trick is to rotate the picture by 90 degrees. In this case the framework supplies a lossless rewriting of a jpeg file
Weeks of programming can save you hours of planning
Hallo zusammen
Muss mich entschuldigen. Hatte einen Fehler in der Kontrollroutine. Ich prüfe das neue Bild mit dem alten Pixel für Pixel und hatte dort einen Fehler drin.
Mit ExifLibNet funktioniert es. Jeder Pixel ist noch gleich.
Mit dem 90° Trick zeigt er jedoch Differenzen.
Herzlichen Dank für Eure Hilfe/Zeit.
Grüsse
Black_Rider