it-swarm.com.de

Problem beim Lesen von JPEG-Metadaten (Orientierung)

Ich habe ein JPEG-Bild, das auf einem iPhone aufgenommen wurde. Auf meinem Desktop-PC (Windows Photo Viewer, Google Chrome usw.) ist die Ausrichtung falsch.

Ich arbeite an einer ASP.NET MVC 3-Webanwendung, in der ich Fotos hochladen muss (derzeit mit plupload).

Ich habe serverseitigen Code zum Verarbeiten von Bildern, einschließlich des Lesens von EXIF-Daten.

Ich habe versucht, das Feld PropertyTagOrientation in den EXIF-Metadaten zu lesen (mithilfe von GDI - Image.PropertyItems), aber das Feld ist nicht vorhanden.

Es handelt sich also entweder um bestimmte iPhone-Metadaten oder um andere Metadaten.

Ich habe ein anderes Tool wie Aurigma Photo Uploader verwendet, das die Metadaten korrekt liest und das Bild dreht. Wie macht es das?

Weiß jemand, welche anderen JPEG-Metadaten die Informationen enthalten könnten, die erforderlich sind, um zu wissen, dass sie gedreht werden müssen, das von Aurigma verwendet wird?

Hier ist der Code, den ich zum Lesen der EXIF-Daten verwende:

var image = Image.FromStream(fileStream);

foreach (var prop in image.PropertyItems)
{
   if (prop.Id == 112 || prop.Id == 5029)
   {
      // do my rotate code - e.g "RotateFlip"
      // Never get's in here - can't find these properties.
   }
}

Irgendwelche Ideen?

48
RPM1984

Es scheint, dass Sie vergessen haben, dass die Werte der Orientierungs-ID, die Sie nachgeschlagen haben, im Hex-Format sind. Wo Sie 112 verwenden, sollten Sie 0x112 verwendet haben. 

In diesem Artikel wird erläutert, wie Windows die Orientierungsübergabe beschleunigt und diese scheint ziemlich relevant für das, was Sie tun.

17
spender

Hier ist ein Ausschnitt der 8 Orientierungswerte.

Zuerst ein paar Anmerkungen:

Die EXIF-ID 0x0112 dient zur Orientierung. Dies ist eine hilfreiche EXIF-ID-Referenz http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

0x0112 ist das Hexäquivalent von 274. Der Datentyp eines PropertyItem.Id ist eine int, dh 274 ist hier nützlich.

Außerdem sollte 5029 wahrscheinlich 0x5029 oder 20521 sein, was mit ThumbnailOrientation korreliert, obwohl dies wahrscheinlich nicht das ist, was hier gewünscht wird.

Orient Image:

Hinweis: img ist ein System.Drawing.Image oder erbt davon, wie System.Drawing.Bitmap.

if (Array.IndexOf(img.PropertyIdList, 274) > -1)
{
    var orientation = (int)img.GetPropertyItem(274).Value[0];
    switch (orientation)
    {
        case 1:
            // No rotation required.
            break;
        case 2:
            img.RotateFlip(RotateFlipType.RotateNoneFlipX);
            break;
        case 3:
            img.RotateFlip(RotateFlipType.Rotate180FlipNone);
            break;
        case 4:
            img.RotateFlip(RotateFlipType.Rotate180FlipX);
            break;
        case 5:
            img.RotateFlip(RotateFlipType.Rotate90FlipX);
            break;
        case 6:
            img.RotateFlip(RotateFlipType.Rotate90FlipNone);
            break;
        case 7:
            img.RotateFlip(RotateFlipType.Rotate270FlipX);
            break;
        case 8:
            img.RotateFlip(RotateFlipType.Rotate270FlipNone);
            break;
    }
    // This EXIF data is now invalid and should be removed.
    img.RemovePropertyItem(274);
}
110
ReenignE

Von diesem Beitrag scheint es so, als müssten Sie ID 274 überprüfen

foreach (PropertyItem p in properties) {
      if (p.Id == 274) {
            Orientation = (int)p.Value[0];
         if (Orientation == 6)
            oldImage.RotateFlip(RotateFlipType.Rotate90FlipNone);
         if (Orientation == 8)
            oldImage.RotateFlip(RotateFlipType.Rotate270FlipNone);
      break;
      }
}
15
Bala R

Ich kombinierte die gegebenen Antworten und Kommentare und kam dazu:

    MemoryStream stream = new MemoryStream(data);
    Image image = Image.FromStream(stream);

    foreach (var prop in image.PropertyItems) {
        if ((prop.Id == 0x0112 || prop.Id == 5029 || prop.Id == 274)) {
            var value = (int)prop.Value[0];
            if (value == 6) {
                image.RotateFlip(RotateFlipType.Rotate90FlipNone);
                break;
            } else if (value == 8) {
                image.RotateFlip(RotateFlipType.Rotate270FlipNone);
                break;
            } else if (value == 3) {
                image.RotateFlip(RotateFlipType.Rotate180FlipNone);
                break;
            } 
        }
    }
12
Ron Burgundy

Posten hier nur für den Fall, dass jemand das gleiche Problem hat. Ich hatte Probleme in der Produktion, die Orientierung mit WFP und GDI zu lesen. Das einzige, was funktionierte, war die Verwendung von: https://github.com/dlemstra/Magick.NET

Der Code ist ziemlich einfach:

var img = new MagickImage(inputStream);
img.AutoOrient();   // Fix orientation
img.Strip();        // remove all EXIF information
img.Write(outputPath);
0
Diego Jancic