Zuordnung von Bild-Eigenschaft
-
Im Explorer kann man zu Bildern Eigenschaften anzeigen lassen. Kann mir irgendjemand sagen, um welche PropertyItem-ID es sich bei dem Feld Details-Beschreibung-Titel handelt?
Ich habe es schon mit '0x010E' probiert, damit kann der Wert ausgelesen werden, aber eine Änderung wird von Windows nicht wahrgenommen.
-
Ich hab jetzt keine Lust mich reinzudenken und andere anscheinend auch nicht. Du weißt anscheinend mehr, als du zugibst. Du redest ja schon von eienr "PropertyItem-ID", also hast du konkrete APIs und Klassen im Sinn. Ich könnte mir verschiedene APIs und Bibliotheken vorstellen, wo der Begriff passt. Also wenn du eine konkrete Frage hast, dann sag doch zumindest, worum es genau geht.
-
Wenn man die WPF-Klasse System.Drawing.Image verwendet, kann man diverse Eigenschaften eines Bildes auslesen - das sind an die 50 verschiedene, die mittels einer sogenannten PropertyItem-ID unterschieden werden.
Wenn ich im Explorer einem jpg-Bild über Eigenschaften/Details/Beschreibung einen Text zuweise, kann man den mit der Methode GetPropertyItem() und der ID '0x010E' auch abfragen und es funktioniert ohne Probleme.
Wenn ich nun versuche, mit der Methode SetPropertyID einen neuen Text zuzuweisen, geht das auch ohne Probleme und ich kann diese neue Eigenschaften auch mit anderen Programmen erneut abfragen. Wenn ich mir das Bild aber im Explorer anschaue, dann hat sich dort aber überhaupt nichts geändert, d.h. es steht dort immer noch der alte Text. Kann sich einer erklären, woran das liegt?System.Drawing.Image img = System.Drawing.Image.FromFile(datei); PropertyItem i = img.PropertyItems[0]; i.Id = 0x010E; // PropertyTagImageDescription i.Type = 1; i.Value = System.Text.Encoding.ASCII.GetBytes(s); i.Len = i.Value.Length+1; // das neue Property hinzufügen img.SetPropertyItem(i); img.RotateFlip(RotateFlipType.Rotate90FlipNone); img.RotateFlip(RotateFlipType.Rotate270FlipNone); img.Save(datei, ImageFormat.Jpeg);
-
Ja also, es geht um .NET, hab ichs mir doch gedacht, hat überhaupt nichts mit WinApi zu tun.
Ich würde mich da jetzt nicht so auf den Explorer festlegen. Was der Explorer da unter Eigenschaften anzeigt, speichert er wohl nicht als Tag in der Bilddatei, sondern in einem ADS. Das macht er auch für andere Dateien, ohne den konkreten Aufbau der Datei zu kennen. Vielleicht schreibt er das bei Bilddateien aber auch zusätzlich mit in die Datei. Die PropertyItems werden aber schon als Tag in die Datei geschrieben und der Exlorer bevorzugt an der Stelle vielleicht eher den Eintrag aus dem ADS. Ich hatte da auch mal Probleme damit, ist aber schon ewig her und ich habe leider vergessen, wie das genau abläuft. Ist auf jeden Fall nicht transparent und nichts, worauf man sich unbedingt verlassen sollte.
-
Abgesehen davon, das .NET mit WinAPI nix zu tun hat:
Du greifst ja immer auf PropertyItems[0] zu. Versuch mal, alle PropertyItems durchzugehen und dann das PropertyItem, das die ID 0x010E hat, zu bearbeiten:foreach(PropertyItem prop in img.PropertyItems) { if(prop.ID == 0x010E) { //mach hier deine Bearbeitungen } }
Was mir außerdem auffällt: Hier steht, dass der Titel die ID 0x0320 hat und nicht 0x010E.
-
Ich habe es auch schon mit der ID '0x0320' probiert, es funzt trotzdem nicht. Das komische ist, dass beim Auslesen die ID '0x010E' immer den korrekten Wert enthält.
PropertyItems[0] verwende ich nur, weil ich zu PropertyItem keinen Konstruktor gefunden habe und deswegen nehme ich mir eben ein beliebiges vorhandenes Objekt.
Diese Methoden 'RotateFlip()' sind notwendig, da das Bild sonst nicht unter gleichem Namen speicherbar ist (es wirft immer eine ExternalException)
Ich kann mich sonst wohl nur noch an Microsoft direkt wenden und dort nach der exakten ID fragen...
-
AngelaMerkel schrieb:
Ich kann mich sonst wohl nur noch an Microsoft direkt wenden und dort nach der exakten ID fragen...
Ja, am besten direkt bei Bill Gates zu Hause anrufen. Mache ich auch immer, wenn ich was in deren API nicht verstehe.
Wenn du eh schon WPF benutzt, schau dir mal die BitmapMetaData Klasse an, bzw. generell die neuren .NET 3.5 Klassen, da hat sich mittlerweile einbisschen was getan.