ruta - permiso de camara en android studio
Orientación de la imagen desde la galería/intención de la cámara (12)
Úselo de esta manera!
private static int exifToDegrees(int exifOrientation) {
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
return 90;
} else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
return 180;
} else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
return 270;
}
return 0;
}
Y en el código,
Bitmap newImage = Bitmap.createBitmap(actualImage, 0, 0, width, height, matrix, true);
¡Sencillo!
Obtengo una foto de mi aplicación desde la cámara / galería. En muchos teléfonos, la imagen que leí del intento / Uri ya está girada para corregir la orientación. Por ejemplo, N1, Legend, Desire, ese es el caso.
Pero luego, en algunos teléfonos (por ejemplo, Milestone1, GalaxyS) la imagen siempre está en el paisaje más, sin importar de qué lado se tomó la fotografía. Esto significa que en mi aplicación, la imagen de retrato se presenta de manera incorrecta para el usuario. Traté de leer la información EXIF de la imagen pero la etiqueta de orientación siempre es 0. Tiene que haber una manera de descubrir la orientación correcta de la imagen porque en Milestone1 la aplicación de la galería muestra las imágenes de retratos correctamente.
¿Cómo sé si necesito rotar la imagen yo mismo antes de mostrársela al usuario?
¡Gracias por tu ayuda!
El siguiente método devuelve la orientación de una imagen en grados. Funciona con imágenes de la galería. Valores de retorno para:
- paisaje normal: 0
- retrato normal: 90
- paisaje al revés: 180
- retrato boca abajo: 270
- imagen no encontrada: -1
El código:
public static int getOrientation(Context context, Uri photoUri) {
Cursor cursor = context.getContentResolver().query(photoUri,
new String[] { MediaStore.Images.ImageColumns.ORIENTATION },
null, null, null);
try {
if (cursor.moveToFirst()) {
return cursor.getInt(0);
} else {
return -1;
}
} finally {
cursor.close();
}
}
Esta es la mejor respuesta que he encontrado, por ramaral. https://.com/a/20480741/2258389
Funciona muy bien para galería o cámara
La respuesta de Florian está trabajando para las imágenes de la galería.
El siguiente código funciona para imágenes capturadas, no se ha intentado con imágenes de galería, pero creo que debería funcionar. Espero que esto ayude a cualquiera.
Código:
public static int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath){
int rotate = 0;
try {
context.getContentResolver().notifyChange(imageUri, null);
File imageFile = new File(imagePath);
ExifInterface exif = new ExifInterface(
imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
Log.v(TAG, "Exif orientation: " + orientation);
} catch (Exception e) {
e.printStackTrace();
}
return rotate;
}
EDITAR: como se puede leer en los comentarios, algunos dispositivos no son compatibles con la información Exif, no han revisado cuál, pero creo que HTC no lo hace. asegúrese de verificar qué dispositivos y crear una alternativa.
Las respuestas simples de grado solo funcionan consistentemente cuando has tomado una foto y la uso para eso. Para aquellos de ustedes que tengan problemas para elegir una fotografía y obtener la orientación correcta, consulte mi respuesta aquí: Orientación de la imagen - Android
Lo que estoy haciendo: primero verifique la orientación de la imagen tomada por la cámara usando su información de metadatos, y Si encontramos esto en el retrato, entonces tenemos que rotar la imagen por 90 y mostrar de lo contrario solo la pantalla.
Para obtener la información sobre la orientación de la imagen, podemos usar la interfaz Exif. ¡Eso es!
Parece el mismo problema que se resolvió en esta pregunta: Android: los mapas de bits cargados desde la galería se rotan en ImageView
Primero debe crear el objeto de la galería usando contentresolver y luego pasar el uri creado al intento de captura de la imagen. Luego puede ver los datos exif, NO los datos de orientación de la galería.
Tengo el mismo problema con S1, y noté que incluso si abres la imagen con la aplicación de la galería de valores, se abrirá en modo horizontal (el teléfono no sabe la orientación correcta para la foto).
Y si gira el teléfono hacia el retrato en la aplicación de la cámara, los iconos (tomar foto, enfoque y configuración) no girarán, intente que en S2 o en cualquier dispositivo que soporte la cámara panorámica / vertical esos iconos se rotarán.
Lo que estoy seguro es que la aplicación de cámara de valores no admite tomar fotos en modo prorrateado.
Ya hice eso para un proyecto, porque tuve el mismo problema (Android pensando que solo harías una foto en el paisaje). Lo que hice fue detectar la orientación del teléfono en ese momento, y luego rotar la imagen. Sin embargo, supone que la orientación sigue siendo la misma cuando se recibe el intento.
int rotate = 0;
try {
File imageFile = new File(sourcepath);
ExifInterface exif = new ExifInterface(
imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
} catch (Exception e) {
e.printStackTrace();
}
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Matrix matrix = new Matrix();
ExifInterface exifReader = new ExifInterface(filePath);
int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
if (orientation ==ExifInterface.ORIENTATION_NORMAL) {
// Do nothing. The original image is fine.
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
matrix.postRotate(90);
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
matrix.postRotate(180);
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
matrix.postRotate(270);
}