2012-01-10 14 views

Respuesta

12

Es necesario utilizar la etiqueta EXIF ​​incrustada en la foto:

private int getExifOrientation() { 
    ExifInterface exif; 
    int orientation = 0; 
    try { 
    exif = new ExifInterface(mImagePath); 
    orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
    Log.d(TAG, "got orientation " + orientation); 
    return orientation; 
} 

Sin embargo, el valor real devuelto EXIF ​​es sorta raro. Permite toda variedad de rotación y espejado. La mejor referencia que he encontrado es here. En general, después de obtener la orientación, tendrá que ejecutar a través de una función de búsqueda para obtener la rotación en grados:

private int getBitmapRotation() { 
    int rotation = 0; 
    switch (getExifOrientation()) { 
    case ExifInterface.ORIENTATION_ROTATE_180: 
     rotation = 180; 
     break; 
    case ExifInterface.ORIENTATION_ROTATE_90: 
     rotation = 90; 
     break; 
    case ExifInterface.ORIENTATION_ROTATE_270: 
     rotation = 270; 
     break; 
    } 

    return rotation; 
} 
+2

Recibí el error "01-11 00: 51: 37.687: ERROR/JHEAD (7055): no puedo abrir '/file:/mnt/sdcard/.temp/photo1151619024.jpg'" en esa línea "exif = new ExifInterface (mImagePath); " – StoneHeart

+0

Estoy seguro de que el archivo todavía está allí y ya configuré el permiso android.permission.WRITE_EXTERNAL_STORAGE en el manifiesto – StoneHeart

+2

/file:/no se ve como una parte adecuada de la ruta ... probablemente sea solo/mnt/sdcard/... – elijah

1

¿Se puede determinar la orientación en función de la altura y el ancho de la foto? Si es más ancho que alto, es paisaje. Si es más alto que ancho, es retrato.

Si es cuadrado, entonces tendrías que leer los datos EXIF ​​y con suerte está configurado para esas imágenes. Los datos EXIF ​​deben proporcionar datos de orientación.

+0

No, tienen el mismo ancho y alto – StoneHeart

+0

Las dimensiones no son suficientes, puede ser un paisaje pero al revés, dependiendo de si giré el teléfono hacia la izquierda o hacia la derecha para tomar la fotografía. –

7

que estaba buscando una solución similar a mi problema. Estoy sacando una foto de una cámara o galería y convirtiéndola en un mapa de bits para usar en mi aplicación. El problema era que las fotos tomadas en PORTRAIT se estaban girando -90 grados.

Buscando respuestas He encontrado este post y https://stackoverflow.com/a/11081918/3062284 que son muy similares. De hecho, utilicé la última publicación. Sin embargo, al igual que @StoneHeart, recibí un error al leer la ruta de la imagen.

yo estaba usando este código en mi onActivityResult():

case CAMERA_REQUEST_CODE: 
if (resultCode == RESULT_OK); 
uriImage = data.getData(); 
ExifInterface exif = new ExifInterface(uriImage.getPath()); 

Dado que este error no se abordó en los comentarios anteriores que pensé que iba a compartir la solución que encontré usando https://stackoverflow.com/a/10564727/3062284

que necesitaba el verdadero ruta para el archivo utilizando este método desde la publicación.

 private String getRealPathFromURI(Uri contentUri) { 
     String[] proj = { MediaStore.Images.Media.DATA }; 
     CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null); 
     Cursor cursor = loader.loadInBackground(); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

y editar mi código a la siguiente:

case CAMERA_REQUEST_CODE: 
if (resultCode == RESULT_OK); 
uriImage = data.getData(); 
String imagePath = getRealPathFromURI(uriImage); 
ExifInterface exif = new ExifInterface(imagePath); 

y que fija el "jhead no puede abrir archivo" error que estaba recibiendo.

+0

¡Boom acaba de terminar mi problema de 2 horas! –

+0

La mejor solución para el problema de JHead – rookieDeveloper

Cuestiones relacionadas