Wenn die Bilder enthält exif data die PropertyItems
sollte die Orientierung Tag enthalten.
PropertyTagOrientation
Bildausrichtung betrachtet in Bezug auf die Zeilen und Spalten: richtig
Es kodiert für die Rotation/Spiegeln notwendig, das Bild anzuzeigen.
Tag 0x0112
1 - die 0-te Zeile ist an der Spitze des visuellen Bildes, und die 0-te Spalte ist die visuelle linke Seite.
2 - Die 0th Zeile befindet sich am oberen Bildrand und die 0te Spalte ist die visuelle rechte Seite.
3 - Die 0. Zeile befindet sich im unteren Bereich des Bildes , und die 0. Spalte ist die visuelle rechte Seite.
4 - Die 0. Zeile befindet sich am unteren Bildrand und die 0. Spalte ist die visuelle linke Seite.
5 - Die 0. Zeile ist die visuelle linke Seite des Bildes und die 0. Spalte ist die visuelle Spitze.
6 - Die 0. Zeile ist die visuelle Seite des Bildes, und die 0. Spalte ist die visuelle Spitze.
7 - Die 0. Zeile ist die visuelle rechte Seite des Bildes und die 0. Spalte ist die visuelle Unterseite.
8 - Die 0. Reihe ist die visuelle linke Seite des Bildes, und die 0. Spalte ist der visuelle Boden.
Hier ist eine Funktion ein abzurufen PropertyItem
:
PropertyItem getPropertyItemByID(Image img, int Id)
{
return img.PropertyItems.Select(x => x).FirstOrDefault(x => x.Id == Id);
}
Hier ist ein Beispiel für die GDI + RotateFlip
Verfahren der Verwendung eines Bildes auf der Fliege zu justieren:
void Rotate(Bitmap bmp)
{
PropertyItem pi = bmp.PropertyItems.Select(x => x)
.FirstOrDefault(x => x.Id == 0x0112);
if (pi == null) return;
byte o = pi.Value[0];
if (o==2) bmp.RotateFlip(RotateFlipType.RotateNoneFlipX);
if (o==3) bmp.RotateFlip(RotateFlipType.RotateNoneFlipXY);
if (o==4) bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
if (o==5) bmp.RotateFlip(RotateFlipType.Rotate90FlipX);
if (o==6) bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
if (o==7) bmp.RotateFlip(RotateFlipType.Rotate90FlipY);
if (o==8) bmp.RotateFlip(RotateFlipType.Rotate90FlipXY);
}
Es gibt die gedrehte Version ..
Ich habe getestet, um Werte mit this nice set of sample images.
Hinweis: Der Code funktioniert nur, wenn die Bilder tatsächlich das Orientierungs-Tag enthalten. Wenn sie es nicht tun, vielleicht weil sie Scans sind, dann wird es nichts tun.
Hinweis 2 Sie schrieb Ich überprüfte die ursprüngliche Bildrotation. Das ist nicht so einfach: Der Explorer zeigt die bereits gedrehten Bilder an, so dass sie alle richtig aussehen und selbst die Überprüfung der Eigenschaften zeigt nicht die Ausrichtung!
Normalerweise, wenn keine EXIF-Daten vorhanden sind, die PropertyTagOrientation
Tag ist vorhanden, aber nur den Standardwert von 1
..
Update: Wenn das Bild nicht die PropertyTagOrientation
haben hier ist, wie Sie hinzufügen können:
using System.Runtime.Serialization;
..
pi = (PropertyItem)FormatterServices
.GetUninitializedObject(typeof(PropertyItem));
pi.Id = 0x0112; // orientation
pi.Len = 2;
pi.Type = 3;
pi.Value = new byte[2] { 1, 0 };
pi.Value[0] = yourOrientationByte;
yourImage.SetPropertyItem(pi);
Kudos to @ ne1410s ausgezeichneten answer here!.
Beachten Sie, dass das Hinzufügen von PropertyItems
zu einem Bild keine Exif-Daten hinzufügt; Die zwei sind verschiedene Tag-Sets!
Sie meinen einige Bilder (ohne die ursprüngliche Bilddrehung zu ändern), wenn das hochgeladene Bild sich beispielsweise um 90 Grad von der ursprünglichen Drehposition dreht? –
@ P.Pat Ja, manchmal sogar 180 ° –