SetRotation (90) para tomar la imagen en el modo vertical no funciona en los dispositivos samsung
Según la documentación, setRotation (90) debe girar la imagen JPEG capturada ( takePicture en modo horizontal.
Esto funciona bien en un teléfono HTC, pero no funciona en Samsung Google Nexus S y Samsung Galaxy S3. ¿Es esto un error?
- Lectura de imágenes RGB con un ImageReader
- Configurar el tamaño de la cámara - ¿Parámetros vs intención?
- Falla de la cámara androide entrega resultados resultinfo
- Apache cordova aplicación de reinicio de la cámara en la galaxia S5
- Cómo restringir el complemento para cambiar la cámara trasera / trasera en android / cordova
Sé que puedo utilizar la matriz de rotación de transformación, pero deseo que el sistema operativo puede hacer esto de manera más eficiente, y no quieren correr el riesgo de sobre-rotación en algunos otros dispositivos.
editar
Establecer camera.setDisplayOrientation(90);
Hizo la previsualización para estar en modo retrato, sin embargo no tuvo ningún efecto en la imagen tomada.
Además, además de setRotation
, también he intentado establecer el tamaño de la imagen – donde hago h
con w
: parameters.setPictureSize(1200, 1600);
. Esto tampoco tuvo ningún efecto.
solución
Al parecer, los teléfonos Samsung establecen la etiqueta de orientación EXIF, en lugar de girar píxeles individuales. Como ariefbayu
sugirió, leer el mapa de bits utilizando BitmapFactory
no es compatible con esta etiqueta. Su muestra de código es la solución, y esta solución también es compatible con el uso de inSampleSize
.
- ¿Está correctamente documentada la CameraInfo.orientation de Android? ¿Implementado incorrectamente?
- Lectura de código QR con cámara - Android
- Android cámara de pantalla completa - manteniendo la cámara seleccionada ratio
- Cámara en modo Burst en Android, que puede tomar varias imágenes
- PhoneGap en Android: el procedimiento de éxito de camera.getPicture no se llama
- Android: camera onPause / onResume issue
- Uso de la API de Camera2 con ImageReader
- Cámara Android: se ejecuta en segundo plano desde el servicio
Trato de responder a 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); }
Liso22, el flujo variable no hace la diferencia, sólo tienes que conectar tu mapa de bits, sin embargo lo tienes (decodeFile etc). Y si tiene problemas con el 'ImageUtil.rotate (), simplemente escriba' static static bitmap rotate () 'como un método con los mismos parámetros y haga que' real image 'sea igual a eso. De todos modos, esta solución no parece estar funcionando para mí, la etiqueta exif devuelve 1 (normal) ya sea en retrato o paisaje.
- Cómo añadir un botón Google +1 en la aplicación para Android
- Cómo evitar los ya autorizados en Android Facebook SDK