Entwickler-Ecke
Multimedia / Grafik - Bitmaps Orientierung korrigieren (PropertyTagOrientation)
Pimpfson - Di 18.05.10 12:51
Titel: Bitmaps Orientierung korrigieren (PropertyTagOrientation)
Hi,
ich habe ein Programm geschrieben, welches Bilder auf eine bestimmte Größe verkleinert und die Orientierung ändert. Bei Bildern von neuen Digitalkameras ist diese Information ja in den Metadaten gespeichert. Das ganze funktioniert auch, sofern ich eine Variable vom Typ Image übergebe:
z.B.:
C#-Quelltext
1: 2: 3:
| Image img = Image.FromFile(@"C:\1.jpg"); System.Drawing.Imaging.PropertyItem props = img.GetPropertyItem(0x0112); byte orientierung = props.Value[0]; |
Je nachdem welchen Wert orientierung hat, wird in einer anderen Funktion die entsprechende Flip Methode gewählt und das Bild gedreht. Ich hab mir danach gedacht, dass es sinnvoller wäre das Bild zu drehen, nachdem es verkleinert wurde.
C#-Quelltext
1: 2: 3: 4: 5:
| Image img = Image.FromFile(@"C:\1.jpg"); Bitmap bmp = new Bitmap(img, new Size(x,y)); System.Drawing.Imaging.PropertyItem props = bmp.GetPropertyItem(0x0112); byte orientierung = props.Value[0]; |
Hier wird ExternalException ausgelöst mit der Message "A generic error occurred in GDI+.". Ich verstehe nicht warum! Bitmap ist von Image abgeleitet. Die Methode steht also zur Verfügung. Es hilft auch nicht weiter bmp als Image zu boxen. Selbes Problem! Wieso kann ich aus der Instanz bmp jetzt nicht mehr die Tags auslesen?
Gruß
danielf - Di 18.05.10 13:08
Hallo,
ich habe gerade bei MSDN geschaut aber nichts bezüglich deines Problems gefunden. Ich hätte geschätzt, dass die allgemeine Image Klasse das Property Position anders auswertet als die konkrete Bitmap Klasse. Leider nichts dementsprechendes in der Doku gefunden.
Warum verwendest du den nicht einfach wieder das img.GetPropertyItem(0x0112)?
Gruß
Pimpfson - Di 18.05.10 13:21
Das benutze ich ja derzeit.
Ich dachte nur, dass es aus Rechenleistungsgründen sinnvoller wäre, das verkleinerte Bild zu drehen, vor allen Dingen, wenn man mehrere Bilder gleichzeitig ändert.
Wobei mir grad einfällt, dass ich ja mit img.GetPropertyItem() die entsprechende Infos bekomme und das dann später auf die Bitmap anwenden kann. Anfängerfehler :)
Aber Danke für die Infos
---
Moderiert von
Narses: Beiträge zusammengefasst---
Sry für Doppelpost, aber mir ist eben gerade wieder eingefallen, warum obiges doch nicht gemacht habe.
Nachdem ich das Bild gedreht habe, muss ich ja eigentlich auch den Wert von PropertyTagOrientation ändern, sodass andere Programme (Irfanview z.B. zeigt Bilder in der Orientierung nach diesem Tag an) das Bild nicht nochmals drehen.
danielf - Di 18.05.10 13:39
Das stimmt natürlich :)
aber ich denke wenn du ein neues Bitmap anlegst (Zeile 2) dann ist das Flag auch nicht gesetzt. Dementsprechend bekommst du eine Fehlermeldung wenn du es versuchst auszulesen.
Sprich wenn du das Bild korrekt drehst sollte das Flag passen (keine Drehung). Aber am Besten du probierst es aus.
Pimpfson - Di 18.05.10 14:15
Tatsache. Bei der Bitmap Instanz werden diese Flags anscheinend verworfen.
snappx - Do 01.07.10 17:56
Hi zusammen!
Das Problem liegt in der Zeile
Pimpfson hat folgendes geschrieben : |
Hi,
C#-Quelltext 1:
| Bitmap bmp = new Bitmap(img, new Size(x,y)); |
|
Denn da wird explizit ein neues Bitmap-Objekt erzeugt, und (wer weiß warum) da werden die Metadaten nicht übernommen.
Einfacher wäre, das Objekt einfach mit einer Umwandlung zuzuordnen. Wie geht das in C#?
C#-Quelltext
1:
| Bitmap bmp = (Bitmap)img; |
Ciao
snappx
Kha - Do 01.07.10 22:07
:welcome:
Das "Vergessen" der Metadaten war ja gerade erwünscht und der Thread ist deshalb seit mehr als einem Monat gelöst :) . Und mit einem Cast wirst du auch nicht weit kommen, wenn die Größe des Bildes geändert werden soll.
snappx - Do 01.07.10 22:40
Kha hat folgendes geschrieben : |
:welcome: |
Danke!
Kha hat folgendes geschrieben : |
Das "Vergessen" der Metadaten war ja gerade erwünscht |
Das las ich total anders. Aber macht ja nix...
Kha hat folgendes geschrieben : |
...und der Thread ist deshalb seit mehr als einem Monat gelöst :) |
Aber den Unterschied zwischen "Klappe halten können" und "Klappe halten sollen" ignorier ich zwischendurch ganz gern mal. :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!