Tengo un JPEG imagen, que fue tomada en un iphone. En mi PC de escritorio (Visualizador de Fotos de Windows, Google Chrome, etc) la orientación es incorrecta.

Estoy trabajando en una ASP.NET MVC 3 aplicación web donde tengo que subir fotos (en la actualidad el uso de plupload).

Tengo un poco de código del lado del servidor para procesar imágenes, incluyendo la lectura de los datos EXIF.

He intentado leer el PropertyTagOrientation campo en los metadatos EXIF (utilizando GDI – Image.PropertyItems), pero el campo no está presente.

Así que o algunos iphone específico meta de datos, o alguna otra meta datos.

He utilizado otra herramienta como Aurigma Photo Uploader, y se lee con la meta de datos correctamente y gira la imagen. ¿Cómo hace esto?

¿Alguien sabe qué otras JPEG meta de datos podría contener la información necesaria para saber que necesita ser girado, que es utilizado por Aurigma?

Este es el código que estoy usando para leer los datos EXIF:

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.
   }
}

Alguna idea?

InformationsquelleAutor RPM1984 | 2011-06-03

5 Comentarios

  1. 17

    Parece que se olvida de que la orientación de los valores de id buscó están en hexadecimal. Donde se utiliza 112, usted debe haber utilizado 0x112.

    Este artículo explica cómo Windows ballsed-hasta la orientación de la entrega, y este parece muy relevante de lo que están haciendo.

    • «EPIC FAIL». Su derecho. 0x0112 trabajado. Gracias!
    • Iphone5S no es un trabajo, foto toked sin datos EXIF, alguna solución?
    • si lo guardas como png de su voluntad de no guardar la información EXIF guardarlo como jpg
  2. 116

    Aquí es un fragmento de abordar el 8 de orientación de valores.

    Primero un par de notas:

    El EXIF id 0 x 0112 es para la Orientación. Este es un útil EXIF identificador de referencia http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

    0 x 0112 es el hexadecimal equivalente de 274. El tipo de datos de un PropertyItem.Id es un int, significado 274 es lo que es útil aquí.

    Además, 5029 probable que se suponía iba a ser 0x5029 o 20521 la cual se correlaciona con ThumbnailOrientation, aunque no es probable que lo que se desea aquí.

    Oriente De Imagen:

    Nota: img es un System.Drawing.Image o hereda de ella, como 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);
    }
    • Mucho más completa respuesta: completa descripción de la orientación de los casos, además de la nota para eliminar los datos EXIF (en caso de que sea procesado posterior)
    • muy útil. esto debe ser aceptado respuesta en mi humilde opinión.
    • Impresionante! Gracias!
    • Gran solución – un protector de la vida!
    • Aquí se pueden encontrar algunas de imagen orientados ejemplos de pruebas: github.com/recurser/exif-orientation-examples
  3. 14

    De este post parece que usted necesita para comprobar el ID de 274

    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;
          }
    }
    • Hmm, trató de que demasiado. Se encontró una propiedad con el identificador 274, pero la orientación de valor es 1. Por lo que no hace el flip.
    • +1 – aunque no es la respuesta correcta, mi rotaciones fueron mal – y los suyos se encuentran a la derecha.
    • Además, «3» es al revés, por sylvana.net/jpegcrop/exif_orientation.html Mis pruebas está de acuerdo.
    • Esto me ayudó inmensamente. Este código se puede utilizar junto con un caso para todas las orientaciones para orientar correctamente cualquier imagen.
  4. 11

    He combinado las preguntas y comentarios y se le ocurrió esto:

        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;
                } 
            }
        }
    • 0x112 = 274, son iguales, así que puede dejar uno de los dos fuera de su declaración si.
    • He intentado esto, pero todavía el problema que enfrentan en el navegador del Móvil. En el navegador Web que está trabajando bien. Pero en el Móvil, la imagen gira 90 grados a la derecha. ayuda?
    • Yo tuve tu mismo problema: acaba de agregar una respuesta que se fija para mí.
  5. 0

    Publicar aquí por si alguien tiene el mismo problema. He tenido problemas en la producción de la lectura de la orientación mediante el PMA y el GDI. Lo único que funcionó fue el uso de: https://github.com/dlemstra/Magick.NET

    El código es bastante simple:

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

Dejar respuesta

Please enter your comment!
Please enter your name here