Estoy capturando una imagen y configurándola como vista de imagen.
public void captureImage() {
Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(filePhoto);
MyApplicationGlobal.imageUri = imageUri.getPath();
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
super.onActivityResult(requestCode, resultCode, intentFromCamera);
if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {
if (intentFromCamera != null) {
Bundle extras = intentFromCamera.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
}
else {
bitmap = getBitmapFromUri();
}
}
else {
bitmap = getBitmapFromUri();
}
// imageView.setImageBitmap(bitmap);
imageView.setImageURI(imageUri);
}
else {
}
}
public Bitmap getBitmapFromUri() {
getContentResolver().notifyChange(imageUri, null);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri);
return bitmap;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
Pero el problema es que la imagen en algunos dispositivos cada vez que se gira. Por ejemplo, en un dispositivo Samsung funciona bien, pero en un Sony Xperia la imagen gira 90 grados y en Toshiba Thrive (tableta) 180 grados.
Respuestas:
La mayoría de las cámaras de los teléfonos son horizontales, lo que significa que si toma la foto en vertical, las fotos resultantes se rotarán 90 grados. En este caso, el software de la cámara debe llenar los datos Exif con la orientación en la que se debe ver la foto.
Tenga en cuenta que la solución a continuación depende del fabricante del software / dispositivo de la cámara que complete los datos Exif, por lo que funcionará en la mayoría de los casos, pero no es una solución 100% confiable.
Aquí está el
rotateImage
método:fuente
exif.getAttributeInt
usoExifInterface.ORIENTATION_UNDEFINED
es casi la misma, ya que el segundo parámetro es el valor predeterminado en caso de que la función no proporcione el valor.Mediante la combinación de Jason Robinson 's respuesta con Félix ' s respuesta y llenar las partes que faltan, aquí está la solución completa definitiva para este problema que va a hacer la siguiente después de probarlo en Android Android 4.1 ( Jelly Bean ), Android 4.4 ( KitKat ) y Android 5.0 ( Lollipop ).
Pasos
Reduzca la imagen si era más grande que 1024x1024.
Gire la imagen a la orientación correcta solo si gira 90, 180 o 270 grados.
Reciclar la imagen girada para fines de memoria.
Aquí está la parte del código:
Llame al siguiente método con la imagen actual
Context
y laURI
que desea corregirAquí está el
CalculateInSampleSize
método de la fuente mencionada anteriormente :Luego viene el método que verificará la orientación de la imagen actual para decidir el ángulo de rotación
Finalmente el método de rotación en sí
-No olvides votar por las respuestas de esos chicos por sus esfuerzos y Shirish Herwade, quien hizo esta útil pregunta.
fuente
Es fácil detectar la orientación de la imagen y reemplazar el mapa de bits usando:
Para evitar quedarse sin recuerdos con imágenes grandes, te recomiendo cambiar el tamaño de la imagen usando:
No es posible usar ExifInterface para obtener la orientación debido a un problema con el sistema operativo Android: https://code.google.com/p/android/issues/detail?id=19268
Y aqui esta
calculateInSampleSize
fuente
Solución de una línea:
O
Esto detectará automáticamente la rotación y colocará la imagen en la orientación correcta
Picasso es una biblioteca muy poderosa para manejar imágenes en su aplicación que incluye: Transformaciones complejas de imágenes con un uso mínimo de memoria.
fuente
He pasado mucho tiempo buscando una solución para esto. Y finalmente logró hacer esto. No olvides votar a @Jason Robinson porque mi se basa en la suya.
Entonces, lo primero que debe saber es que desde Android 7.0 tenemos que usar
FileProvider
y algo llamadoContentUri
, de lo contrario obtendrá un error molesto al intentar invocar suIntent
. Este es un código de muestra:Método
getUriFromPath(Context, String)
basado en la versión de usuario de Android crearFileUri (file://...)
oContentUri (content://...)
y ahí está:Después de
onActivityResult
que pueda captar esouri
donde la imagen se guarda con la cámara, pero ahora tiene que detectar la rotación de la cámara, aquí usaremos la respuesta modificada de @Jason Robinson:Primero necesitamos crear
ExifInterface
basado enUri
El código anterior se puede simplificar, pero quiero mostrarlo todo. Entonces, desde
FileUri
que podemos crear enExifInterface
base aString path
, pero desdeContentUri
que no podemos, Android no es compatible con eso.En ese caso tenemos que usar otro constructor basado en
InputStream
. Recuerde que este constructor no está disponible por defecto, debe agregar una biblioteca adicional:Ahora podemos usar el
getExifInterface
método para obtener nuestro ángulo:Ahora tiene Ángulo para rotar adecuadamente su imagen :).
fuente
activity_main.xml
MainActivity.java
fuente
Puede leer la orientación del sensor de la cámara como lo indica Google en la documentación: https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html
Código de muestra:
fuente
De Jason Robinson respuesta y Sami Eltamawy respuesta son excelentes.
Solo una mejora para completar el enfoque, debe usar compat ExifInterface.
com.android.support:exifinterface:${lastLibVersion}
Podrá crear instancias de ExifInterface (pior API <24) con
InputStream
(desdeContentResolver
) en lugar de rutas uri evitando "Excepciones de archivo no encontrado"https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html
fuente
Normalmente se recomienda resolver el problema con ExifInterface , como sugirió @Jason Robinson. Si este enfoque no funciona, puede intentar buscar la Orientación de la última imagen tomada ...
fuente
Lamentablemente, la respuesta de @ jason-robinson anterior no funcionó para mí.
Aunque la función de rotación funciona perfectamente:
Tuve que hacer lo siguiente para obtener la orientación ya que la orientación Exif siempre fue 0
fuente
Mejor intente tomar la foto en una orientación específica.
Para obtener mejores resultados, brinde orientación horizontal en la actividad de vista de cámara.
fuente
Si alguien experimenta problemas con
ExifInterface
el Android 4.4 (KitKat) para conseguir la orientación, que podrían ser causa de mal camino recibimos de la URI. Vea una solución para propoergetPath
en la pregunta de desbordamiento de pila Obtenga una ruta real desde URI, Android KitKat nuevo marco de acceso de almacenamientofuente
Encuentre a continuación el enlace de esta solución es la mejor https://www.samieltamawy.com/how-to-fix-the-camera-intent-rotated-image-in-android/
fuente
La respuesta seleccionada utiliza el método más común respondido a esta y preguntas similares. Sin embargo, no funciona con las cámaras frontal y posterior de Samsung. Para aquellos que buscan una solución que funcione tanto en cámaras frontales como traseras para Samsung y otros fabricantes importantes, esta respuesta de nvhausid es increíble:
https://stackoverflow.com/a/18915443/6080472
Para aquellos que no quieren hacer clic, la magia relevante es usar CameraInfo en lugar de confiar en EXIF.
Código completo en el enlace.
fuente
Tal vez esto sea evidente, pero siempre recuerde que puede manejar algunos de estos problemas de manejo de imágenes en su servidor. Utilicé respuestas como las contenidas en este hilo para manejar la visualización inmediata de la imagen. Sin embargo, mi aplicación requiere que las imágenes se almacenen en el servidor (este es probablemente un requisito común si desea que la imagen persista mientras los usuarios cambian de teléfono).
Las soluciones contenidas en muchos de los hilos relacionados con este tema no discuten la falta de persistencia de los datos EXIF que no sobreviven a la compresión de imagen del mapa de bits, lo que significa que deberá rotar la imagen cada vez que su servidor la cargue. Alternativamente, puede enviar los datos de orientación EXIF a su servidor y luego rotar la imagen allí si es necesario.
Fue más fácil para mí crear una solución permanente en un servidor porque no tenía que preocuparme por las rutas clandestinas de archivos de Android.
fuente
La solución más simple para este problema:
Estoy guardando la imagen en formato jpg.
fuente
Aquí está la
Xamarin.Android
versión:De la respuesta de @Jason Robinson :
Entonces
calculateInSampleSize
método:De la respuesta de @Sami Eltamawy :
fuente
Si está usando Fresco, puede usar esto:
Esto gira automáticamente las imágenes según los datos Exif.
Fuente: https://frescolib.org/docs/rotation.html
fuente
El siguiente código funcionó conmigo, obtuvo el mapa de bits del archivoUri, y corrige la rotación si es necesario:
fuente
Tengo una respuesta para este problema sin usar ExifInterface . Podemos obtener la rotación de la cámara, ya sea la cámara frontal o la cámara trasera, lo que sea que esté utilizando y, al crear el mapa de bits, podemos rotar el mapa de bits con Matrix.postRotate (grado)
Después de calcular la rotación, puede girar su mapa de bits como a continuación:
Herare bm debería ser tu mapa de bits.
Si desea conocer la rotación de su cámara frontal, simplemente cambie Camera.CameraInfo.CAMERA_FACING_BACK a Camera.CameraInfo.CAMERA_FACING_FRONT arriba.
Espero que esto ayude.
fuente
Creé una función de extensión de Kotlin que simplifica la operación para los desarrolladores de Kotlin basada en la respuesta de @Jason Robinson. Espero que ayude.
fuente
Hay un comando más simple para corregir este error.
Simplemente agregue después de yourImageView.setBitmap (mapa de bits); this yourImageView.setRotation (90);
Esto solucionó el mío. Espero eso ayude !
fuente
esto funcionó para mí
fuente