Autor Beitrag
Pimpfson
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 18.05.10 12:51 
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.:
ausblenden 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.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Image img = Image.FromFile(@"C:\1.jpg");
Bitmap bmp = new Bitmap(img, new Size(x,y));
// Nachfolgende Zeile löst eine Exception aus
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 18.05.10 14:15 
Tatsache. Bei der Bitmap Instanz werden diese Flags anscheinend verworfen.
snappx
Hält's aus hier
Beiträge: 2


VS 2010 Ultimate, VB.NET, C#, ASP.NET, T-SQL
BeitragVerfasst: Do 01.07.10 17:56 
Hi zusammen!

Das Problem liegt in der Zeile

user profile iconPimpfson hat folgendes geschrieben Zum zitierten Posting springen:
Hi,
ausblenden 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#?

ausblenden C#-Quelltext
1:
Bitmap bmp = (Bitmap)img;					


Ciao
snappx
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 2


VS 2010 Ultimate, VB.NET, C#, ASP.NET, T-SQL
BeitragVerfasst: Do 01.07.10 22:40 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
:welcome:

Danke!

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Das "Vergessen" der Metadaten war ja gerade erwünscht

Das las ich total anders. Aber macht ja nix...

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
...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. :)

_________________
Das Leben ist anders.