la etiqueta img muestra una orientación incorrecta


Tengo una imagen en este enlace: http://d38daqc8ucuvuv.cloudfront.net/avatars/216/2014-02-19%2017.13.48.jpg

Como puede ver, esta es una imagen normal con la orientación correcta. Sin embargo, cuando establezco este enlace en el atributo src de mi etiqueta de imagen, la imagen se vuelve al revés. http://jsfiddle.net/7j5xJ /

<body>
    <img src="http://d38daqc8ucuvuv.cloudfront.net/avatars/216/2014-02-19%2017.13.48.jpg" width="200"/>
</body>

¿Tienes alguna idea de lo que está pasando?

Author: Majid, 2014-07-09

11 answers

Encontré parte de la solución. Las imágenes ahora tienen metadatos que especifican la orientación de la foto. Hay una nueva especificación CSS para image-orientation.

Simplemente agrega esto a tu CSS:

img {
    image-orientation: from-image;
}

De acuerdo con las especificaciones del 25 de enero de 2016, Firefox e iOS Safari (detrás de un prefijo) son los únicos navegadores que admiten esto. Estoy viendo problemas con Safari y Chrome todavía. Sin embargo, mobile Safari parece admitir la orientación de forma nativa sin la etiqueta CSS.

Supongo que tendremos que esperar y ver si los navegadores testamentos comienzan a soportar image-orientation.

 67
Author: Chet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 19:47:39

Tu imagen está al revés. Pero tiene un atributo meta "Orientación" que le dice al espectador que debe ser el girado 180 grados. Algunos dispositivos / espectadores no obedecen esta regla.

Abrirlo en Chrome: hacia arriba Ábrelo en FF: hacia arriba Ábrelo en IE: al revés

Ábrelo en Pintura: Boca abajo Ábrelo en Photoshop: Hacia arriba. sucesivamente.

 14
Author: i-CONICA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-19 16:02:26

Olvidé agregar mi propia respuesta aquí. Estaba usando Ruby on Rails por lo que podría no ser aplicable a sus proyectos en PHP u otros frameworks. En mi caso, estaba usando la gema Carrierwave para subir las imágenes. Mi solución fue agregar el siguiente código a la clase uploader para solucionar el problema EXIF antes de guardar el archivo.

process :fix_exif_rotation
def fix_exif_rotation
  manipulate! do |img|
    img.auto_orient!
    img = yield(img) if block_given?
    img
  end
end
 10
Author: The Lazy Log,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-28 01:09:28

Son los datos EXIF que incorpora su teléfono Samsung.

 6
Author: Trace DeCoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-09 16:02:01

Puede utilizar Exif-JS, para comprobar la propiedad "Orientación" de la imagen. Luego aplique una transformación css según sea necesario.

EXIF.getData(imageElement, function() {
                var orientation = EXIF.getTag(this, "Orientation");

                if(orientation == 6)
                    $(imageElement).css('transform', 'rotate(90deg)')
});  
 4
Author: bsap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-27 15:43:37

Una manera fácil de solucionar el problema, sin codificación, es usar la función Guardar para exportación web de Photoshop. En el cuadro de diálogo se puede elegir eliminar todos o la mayoría de los datos EXIF de una imagen. Por lo general, solo conservo los derechos de autor y la información de contacto. Además, dado que las imágenes que vienen directamente de una cámara digital son muy grandes para la pantalla web, es una buena idea reducirlas a través de Save for the Web de todos modos. Para aquellos que no son expertos en Photoshop, no tengo ninguna duda de que hay recursos en línea para cambiar el tamaño de un imagen y despojarlo de cualquier dato EXIF innecesario.

 1
Author: AlGator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-07 20:04:14

Hasta que CSS: image-orientation:from-image; sea más universalmente soportado, estamos haciendo una solución del lado del servidor con python. Esto es lo esencial. Verifique la orientación de los datos exif, luego gire la imagen en consecuencia y vuelva a guardar.

Preferimos esta solución sobre las soluciones del lado del cliente, ya que no requiere cargar bibliotecas adicionales del lado del cliente, y esta operación solo tiene que ocurrir una vez en la carga de archivos.

if fileType == "image":
    exifToolCommand = "exiftool -j '%s'" % filePath
    exif = json.loads(subprocess.check_output(shlex.split(exifToolCommand), stderr=subprocess.PIPE))
    if 'Orientation' in exif[0]:
        findDegrees, = re.compile("([0-9]+)").search(exif[0]['Orientation']).groups()
        if findDegrees:
            rotateDegrees = int(findDegrees)
            if 'CW' in exif[0]['Orientation'] and 'CCW' not in exif[0]['Orientation']:
                rotateDegrees = rotateDegrees * -1
            # rotate image
            img = Image.open(filePath)
            img2 = img.rotate(rotateDegrees)
            img2.save(filePath)
 1
Author: deweydb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-02 00:09:01

Guardar como png resolvió el problema para mí.

 1
Author: Seyed Mostafa Mousavi Kahaki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-30 22:14:46

Este problema me estaba volviendo loco también. Estaba usando PHP en mi lado del servidor, así que no pude usar las soluciones @The Lazy Log(ruby) y @ deweydb(python). Sin embargo, me indicó la dirección correcta. Lo arreglé en la copia de seguridad usando getImageOrientation () de Imagick.

<?php 
// Note: $image is an Imagick object, not a filename! See example use below. 
function autoRotateImage($image) { 
    $orientation = $image->getImageOrientation(); 

    switch($orientation) { 
        case imagick::ORIENTATION_BOTTOMRIGHT: 
            $image->rotateimage("#000", 180); // rotate 180 degrees 
        break; 

        case imagick::ORIENTATION_RIGHTTOP: 
            $image->rotateimage("#000", 90); // rotate 90 degrees CW 
        break; 

        case imagick::ORIENTATION_LEFTBOTTOM: 
            $image->rotateimage("#000", -90); // rotate 90 degrees CCW 
        break; 
    } 

    // Now that it's auto-rotated, make sure the EXIF data is correct in case the EXIF gets saved with the image! 
    $image->setImageOrientation(imagick::ORIENTATION_TOPLEFT); 
} 
?> 

Aquí está el enlace si quieres leer más. http://php.net/manual/en/imagick.getimageorientation.php

 1
Author: user4504661,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-18 05:55:10

Esta respuesta se basa en la respuesta de bsap usando Exif-JS , pero no depende de jQuery y es bastante compatible incluso con navegadores más antiguos. Los siguientes son ejemplos de archivos html y js:

Rotar.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
  <html>
  <head>
    <style>
      .rotate90 {
       -webkit-transform: rotate(90deg);
       -moz-transform: rotate(90deg);
       -o-transform: rotate(90deg);
       -ms-transform: rotate(90deg);
       transform: rotate(90deg);
      }
      .rotate180 {
       -webkit-transform: rotate(180deg);
       -moz-transform: rotate(180deg);
       -o-transform: rotate(180deg);
       -ms-transform: rotate(180deg);
       transform: rotate(180deg);
      }
      .rotate270 {
       -webkit-transform: rotate(270deg);
       -moz-transform: rotate(270deg);
       -o-transform: rotate(270deg);
       -ms-transform: rotate(270deg);
       transform: rotate(270deg);
      }
    </style>
  </head>
  <body>
    <img src="pic/pic03.jpg" width="200" alt="Cat 1" id="campic" class="camview">
    <script type="text/javascript" src="exif.js"></script>
    <script type="text/javascript" src="rotate.js"></script>
  </body>
  </html>

Rotar.js:

window.onload=getExif;
var newimg = document.getElementById('campic');
function getExif() {
    EXIF.getData(newimg, function() {
            var orientation = EXIF.getTag(this, "Orientation");
            if(orientation == 6) {
                newimg.className = "camview rotate90";
            } else if(orientation == 8) {
                newimg.className = "camview rotate270";
            } else if(orientation == 3) {
                newimg.className = "camview rotate180";
            }
        });
};
 1
Author: VMQ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-29 19:24:12

Utilice estilos externos. en la hoja html dar el nombre de la clase a la etiqueta. en la hoja de estilo utilice el operador de punto precedido por el nombre de la clase y luego escriba el siguiente código

.rotate180 {
 -webkit-transform: rotate(180deg);
 -moz-transform: rotate(180deg);
 -o-transform: rotate(180deg);
 -ms-transform: rotate(180deg);
 transform: rotate(180deg);
 }
 -16
Author: msd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-09 16:12:51