2012-06-13 21 views
34

Según la documentación, setRotation(90) debe girar la imagen JPEG capturada (takePicture en modo horizontal.setRotation (90) para tomar la fotografía en el modo vertical no funciona en los dispositivos de Samsung

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

Sé que puedo usar la rotación de transformación de la matriz, pero me gustaría que el SO pueda hacerlo de manera más eficiente y no quiera arriesgar sobre-rotación en algunos otros dispositivos.

editar

La configuración camera.setDisplayOrientation(90); hizo que la vista previa estuviera en modo retrato, sin embargo, no tuvo ningún efecto en la imagen tomada.

Además, setRotation Además, también he tratado de establecer el tamaño de la imagen - en donde me tapa h con w: parameters.setPictureSize(1200, 1600);. Esto tampoco tuvo ningún efecto.

solución

Aparentemente teléfonos Samsung establecer la etiqueta orientación EXIF, en lugar de rotación de los píxeles individuales. Como se sugirió ariefbayu, leer el mapa de bits usando BitmapFactory no es compatible con esta etiqueta. Su código de muestra es la solución, y esta solución también es compatible con el uso de inSampleSize.

+0

¿Ve algún error? – kosa

+0

Echa un vistazo a esta respuesta, ya que podría ayudar: http://stackoverflow.com/questions/3841122/android-camera-preview-is-sideways/5110406 ​​ –

+0

@thinksteep: no, no veo ningún error a través de la consola de Android . – tofi9

Respuesta

33

Intento responder esto en relación con 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); 
} 

El 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); 
} 
+0

Acabo de hacer algunas pruebas más. Resulta que el hardware de Samsung no rota los píxeles, y solo establece la etiqueta de orientación exif en el número 6. Utilizaré su utilidad cuando lea el mapa de bits. Lo bueno de esta solución es que todavía puedo seguir usando el atributo inSampleSize para cargar solo una versión en miniatura, y para evitar OutOfMemoryExceptions – tofi9

+0

hola, estoy teniendo el mismo problema, estoy tratando de implementar la respuesta pero no lo hago. Entiendo a dónde va este código. ¿Cuál es el flujo variable? ¡No hay nada similar en mi código! – lisovaccaro

+0

Hola, está funcionando bien para mí, ¿hay alguna otra manera en lugar de crear un nuevo mapa de bits (Bitmap.createBitmap (bitmap, 0, 0, w, h, mtx, true);), podría desencadenar OutOfMemoryException. –

3

Liso22, la corriente variable no hacer una diferencia, sólo tiene que enchufar en su mapa de bits, sin embargo lo tienes (decodeFile etc). Y si tiene problemas con 'ImageUtil.rotate(), simplemente escriba' bitmap estático público rotate() 'como un método con los mismos parámetros y haga que' imagen real 'sea igual a eso. De todos modos, esta solución no parece funcionar para mí, la etiqueta exif devuelve 1 (normal) ya sea en retrato o paisaje.

Cuestiones relacionadas