0 votos

Hola! He seguido este link de Google para tomar fotos con la cámara: https://developer.android.com/training/camera/photobasics. Me ha funcionado, pero al obtener la miniatura, si tomo una imagen con el teléfono en vertical, se ve en forma horizontal. ¿Cómo puedo corregir esto para que siempre tenga la orientación correcta?

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        imageView.setImageBitmap(imageBitmap);
    }
}

 

por en Android

1 Respuesta

0 votos

La transformación de la imagen (rotación, ampliación y sesgado) lo puedes realizar con Matrix:

Matrix matrix = new Matrix();
matrix.postRotate(90.0);
Bitmap imageBitmapNuevo = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.getWidth(), imageBitmap.getHeight(), matrix, true);

Tendrás que detectar si la imagen ha sido tomada rotada o no para tomar una decisión, para ello puedes utilizar los metadatos en formato EXIF de la imagen con ExifInterface con algo así:

Uri uri = getImageUri(getApplicationContext(), imageBitmap);
File file = new File(getRealPathFromURI(uri));

ExifInterface ei = new ExifInterface(file);
int orientacion = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                                     ExifInterface.ORIENTATION_UNDEFINED);

Matrix matrix = new Matrix();
switch(orientacion) {
    case ExifInterface.ORIENTATION_ROTATE_90:
        matrix.postRotate(90);
        break;

    case ExifInterface.ORIENTATION_ROTATE_180:
        matrix.postRotate(180);
        break;

    case ExifInterface.ORIENTATION_ROTATE_270:
        matrix.postRotate(270);
        break;
}

Bitmap imageBitmapNuevo = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.getWidth(), imageBitmap.getHeight(), matrix, true);

 

por
Hola Ramón! He implementado un código que utiliza lo que has propuesto, sin embargo, al rotar imágenes pesadas se tarda bastante tiempo... ¿Hay alguna forma de reducir los tiempos con imágenes más pesadas?

Con Matrix debería de ser bastante rápida la rotación ¿Estás probando con el emulador o con un Smartphone físico?

Si te sirve puedes probar a rotar el View donde pongas la imagen con setRotate() a ver si va más rápido.

Existe una opción para el procesado rápido de imágenes en Android a bajo nivel con RenderScript (más información en https://developer.android.com/guide/topics/renderscript/compute), pero no creo que te merezca la pena trabajar con RenderScript con lo que puedas ganar de rendimiento, pues Matrix está bastante optimizado para rotar.