De acuerdo a la documentación, métodos setrotation(90) debe girar la captura de la imagen JPEG (takePicture en el modo de paisaje.

Esto funciona muy bien en un teléfono de HTC, pero no funciona en el Samsung Google Nexus S y Samsung Galaxy S3. Es esto un error?

Sé que se puede utilizar la matriz de transformación de rotación, pero desea que el sistema operativo puede hacer esto de manera más eficiente, y no quiere correr el riesgo de sobre-rotación en algunos otros dispositivos.

editar

Configuración camera.setDisplayOrientation(90); hizo de la vista previa para estar en el modo de retrato, sin embargo no tienen ningún efecto en la imagen tomada.

Más, Además de setRotation, también he tratado de establecer el tamaño de la imagen – donde le doy la vuelta h con w: parameters.setPictureSize(1200, 1600);. Esto también no tener ningún efecto.

solución

Al parecer, Samsung teléfonos establecer la orientación EXIF tag, en lugar de girar a cada uno de los píxeles. Como ariefbayu sugerido, la lectura del mapa de bits mediante BitmapFactory no es compatible con esta etiqueta. Su ejemplo de código es la solución, y esta solución también es compatible con el uso de inSampleSize.

  • estás viendo los errores?
  • Echa un vistazo a esta respuesta, ya que podría ayudar: stackoverflow.com/questions/3841122/…
  • no – no veo ningún error a través de la consola android.
  • la respuesta de las preocupaciones de vista previa en la superficie. Mi pregunta es acerca de tomar una foto
  • Creo que esto también puede haber afectado a las imágenes reales tomadas así, pero fue hace un tiempo y fue en un HTC.
  • Configuración de la cámara.setDisplayOrientation(90), hizo de la vista previa para estar en el modo de retrato, sin embargo no tienen ningún efecto en la imagen tomada.
  • Creo que usted está hablando sobre el efecto de la orientación Exif tag.
  • Sí, creo que está relacionado. Lo leí en la documentación de métodos setrotation. De lo que he entendido hay que jpeg tiene una forma de «marcar» la imagen se gira, en lugar de girar a los píxeles individuales. Y que algunas de hardware que podría decidir a girar los píxeles, mientras que otro hardware podría decidir que acaba de establecer esta orientación Exif tag. ¿Crees que Samsung NO establecer esta etiqueta exif, pero el Android de mapa de bits no es compatible con esta etiqueta? Yo uso el siguiente código para leer de nuevo la imagen (para comprobar que la orientación es correcta): mapa de bits del mapa de bits = BitmapFactory.decodeFile(url);
  • como tengo entendido, a partir de jugar con mapa de bits y cámara. Clase de mapa de bits no soporta la etiqueta Exif. Pero, yo podría estar equivocado. La necesidad de leer la documentación de la primera (que, no tengo el tiempo, ahora mismo).
  • compruebe esto hacia fuera stackoverflow.com/a/26141254/1118886

InformationsquelleAutor tofi9 | 2012-06-13

2 Comentarios

  1. 34

    Yo intente responder a esta pregunta en relación a la etiqueta Exif. Esto es lo que hice:

    Bitmap realImage = BitmapFactory.decodeStream(stream);
    
    ExifInterface exif=new ExifInterface(getRealPathFromURI(imagePath));
    
    Log.d("EXIF value", exif.getAttribute(ExifInterface.TAG_ORIENTATION));
    if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("6")){
    
        realImage=ImageUtil.rotate(realImage, 90);
    }else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("8")){
        realImage=ImageUtil.rotate(realImage, 270);
    }else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("3")){
        realImage=ImageUtil.rotate(realImage, 180);
    }

    La ImageUtil.rotate():

    public static Bitmap rotate(Bitmap bitmap, int degree) {
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
    
        Matrix mtx = new Matrix();
        mtx.postRotate(degree);
    
        return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
    }
    • Acaba de hacer algunas pruebas más. Resulta que Samsung hardware no rotar los píxeles, y sólo establece la orientación exif de la etiqueta para el número 6. Voy a utilizar el programa de utilidad cuando la lectura del mapa de bits. Lo bueno de esta solución es que todavía puedo seguir usando el inSampleSize atributo para cargar sólo una versión en miniatura, y para evitar OutOfMemoryExceptions
    • hola, estoy teniendo el mismo problema, estoy tratando de implementar la respuesta pero no entiendo donde esta el código va. ¿Cuál es la variable de flujo? No hay nada similar en mi código!
    • Hola, funciona muy bien para mí, ¿hay alguna otra manera en lugar de crear nuevas bitmap (mapa de bits.createBitmap(mapa de bits, 0, 0, w, h, mtx, true);), es posible que el fuego OutOfMemoryException.
    • Pero, ¿dónde está ImageUtil clase? ¿Dónde puede encontrar yo?
    • Yo no entiendo donde esta el código va. Por favor explique su respuesta.
  2. 3

    Liso22, la variable de flujo de no hacer una diferencia, sólo tiene que enchufar en el mapa de bits, sin embargo, usted recibió (decodeFile etc). Y si usted está teniendo problemas con el ‘ImageUtil.rotate(), sólo tiene que escribir el ‘public static mapa de bits rotate()’ como un método con los mismos parámetros y hacer ‘imagen real’ igual que. De todos modos, esta solución no parece estar funcionando para mí, la etiqueta exif devuelve 1 (normal) ya sea en vertical u horizontal.

Dejar respuesta

Please enter your comment!
Please enter your name here