Laden...

Orientierung eines Fotos in Graphic.DrawString berücksichtigen

Erstellt von ByteDevil vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.385 Views
ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 6 Jahren
Orientierung eines Fotos in Graphic.DrawString berücksichtigen

Hallo liebe Community,

ich schreibe gerade etwas, das Strings auf viele Fotos drucken soll. Dabei kann ich festlegen wo genau es hin soll (unten rechts, oben links, etc..).

Das mache ich in etwa so (etwas gekürzt):


Image image = Image.FromFile(file);
using (Graphics g = Graphics.FromImage(image))
{
      StringFormat format = new StringFormat();
      format.Alignment = StringAlignment.Far;
      format.LineAlignment = StringAlignment.Far;
      Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
      g.DrawString(text, font, new System.Drawing.SolidBrush(color), rect, format);
      image.Save(Path.Combine(outputDir, Path.GetFileName(file)));
}

Soweit klappt das auch, nur leider wird die Schrift bei einigen Bildern manchmal an die völlig falschen Positionen geschrieben...manchmal auf den Kopf, manchmal längs.
Es betrifft immer die Fotos, die in ihren EXIF-Daten zu stehen haben, das sie nicht im Landscape modus geschossen wurden.

Siehe hier
Dort Strg+F und suchen nach "PropertyTagOrientation" oder "0x0112"
Es gibt also 8 unterschiedliche Modi, inklusive gespiegelt, wenn ich Modus 2 richtig verstehe.

Meine Frage ist nun folgende: Wie würdet ihr das Problem lösen? Vor dem verarbeiten des Originalbildes nachsehen, ob das Bild nicht im Modus "1" geschossen wurde und wenn nicht dann die Schrift entsprechend rotieren, oder vielleicht die Exif-Daten des Originalbildes kurz manipulieren und dann wieder auf den vorherigen Wert setzen? Oder gibt es vielleicht eine ganz andere Möglichkeit?

Bin für jeden guten Rat dankbar.

Viele Grüße,
ByteDevil

Edit: Da anscheinend keiner eine bessere Idee hatte, habe ich nun beschlossen die Exif-Daten jedes einzelnen Bildes vorher zu lesen:


enum ImageOrientation { Normal, UpsideDown, RotatedLeft, RotatedRight }

private static ImageOrientation GetImageOrientation(Image image)
{
    if (!image.PropertyIdList.Contains(0x0112)) // PropertyTagOrientation
        return ImageOrientation.Normal;

    foreach (PropertyItem p in image.PropertyItems)
    {
        if (p.Id == 0x0112)
        {
            switch (p.Value[0])
            {
                case 3:
                    return ImageOrientation.UpsideDown;
                case 6:
                    return ImageOrientation.RotatedRight;
                case 8:
                    return ImageOrientation.RotatedLeft;
                default:
                    return ImageOrientation.Normal;
            }
        }
    }

    return ImageOrientation.Normal;
}

und anschließend auszuklamüsern, wie die Schrift zu drehen ist. Hoffe ich kann damit jemandem ewiges Gegrübel ersparen wenn derjenige darüber nachdenkt, warum die Schrift überall ist nur nicht da wo sie sein soll^^ Um die gespiegelten Modis 2, 4, 5 und 7 hab ich mir jetzt allerdings keine Platte gemacht...besitze kein einziges Bild wo das vorkommt.