Auslesen von Bild-Informationen



  • Bei Windows kann man bei Bilddateien ja Zusatzinformationen angeben (Autor, Titel, Kommentar,...)
    Weiss jemand, ob - und wenn ja wie - man in C# darauf zugreifen kann?

    Ich habe es schon mit dem Array System.Drawing.Image.PropertyItem versucht, aber es klappt nicht. Ich habe auch nirgends Informationen darüber gefunden. Oder ist das Array auf die 7 IDs beschränkt? Wahrscheinlich hat Microsoft die anderen Eigenschaften selbst entwickelt...





  • Wenn es dir um die Windows Eigenschaften je Datei geht (und nicht um die im Bild gespeicherten EXIF Werte), dann ist der einfachste Weg für C# das Einbinden des Windows API Code Pack for Microsoft .NET Framework und dort dann auf das "Windows Shell property system" zugreifen.

    Weitere Stichworte für deine Recherche sind "Shell.Namespace" und "Shell.GetDetailsOf". Die Indizes für diese Methoden unterscheiden sich (leider) je Windows-Version - für Win2000 habe ich folgende Liste gefunden: Retrieving Extended File Properties.



  • Du warst schon nah dran.
    Wie Unix-Tom schon verlinkt hat, gibt es ID Konstanten, wobei jede ID z.B. für den Titel, Autor usw. steht:
    http://msdn.microsoft.com/de-de/library/system.drawing.imaging.propertyitem.id.aspx
    Oder mit Beschreibung:
    http://msdn.microsoft.com/de-de/library/ms534416.aspx
    Nutzen kannst du das also so:

    Image i = new Bitmap("Limit.jpg");
    System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
    byte[] value = i.GetPropertyItem(0x010E).Value;
    string title = encoding.GetString(value);
    

    In meinem Beispiel habe ich dem Bild den Titel "Test" zugewiesen, was auch später in meiner string Varaible title steht. 0x010E ist die ID für den Titel.
    Du könntest dir jetzt eine Klasse mit einem Enum erstellen, um dir den Zugriff zu erleichtern.

    public class Property
    {
        public enum PropertyId
        {
            Title = 0x010E
        }
        public string PropertyToString(PropertyId propertyid, Image image)
        {
            System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
            int id = (int)propertyid;
            byte[] value = image.GetPropertyItem(id).Value;
            return encoding.GetString(value);
        }
    }
    

    Dort, wo du diese Methode aufrufst, kannst du mit dem Enum angeben, was für eine ID zurückgegeben werden soll.
    Denk aber daran, dass wen die Eigenschaft nicht vorhanden ist, das Bild also kein Titel beispielsweise hat, eine Ausnahme geworfen wird.



  • Ich hatte zwar auch schon bei Microsoft gesucht, aber ich bin irgendwie immer nur auf die Tabelle mit den 7 Standard-IDs gestossen.



  • Kann man einfach auch Einträge ändern/hinzufügen und diese direkt abspeichern? Wenn ich das probiere, bekomme ich immer eine ExternalException

    System.Drawing.Image img = System.Drawing.Image.FromFile("bild.jpg");
    PropertyItem i = img.PropertyItems[0];
      i.Id = 0x010E; // PropertyTagImageDescription
      i.Type = 2;
      i.Value = System.Text.Encoding.ASCII.GetBytes(s);
      i.Len = i.Value.Length;
    img.SetPropertyItem(i);
    img.Save("bild.jpg", ImageFormat.Jpeg);
    

    Es geht nur, wenn ich erst einen anderen Name angebe und dann nachträglich die Dateien überschreibe, und die zusätzlich angelegte Datei lösche


Anmelden zum Antworten