Android: girar y mostrar la imagen del archivo

Tengo un diseño muy simple con un ImageView. Mi aplicación abre la cámara, guarda una imagen y, a continuación, muestra la imagen en ImageView con BitmapFactory.decodeFile . El único problema es que ha roto. Entiendo que a) esto se debe a que la cámara del teléfono se queda por defecto en el paisaje, por lo que esto debe ser manejado en código y b) el procesamiento de imágenes debe hacerse en un hilo separado de la interfaz de usuario.

La documentación de formación de Android parece estar orientada a cargar imágenes de id de recurso en lugar de rutas de archivo. Esto sólo lanza una llave en las cosas como soy capaz de seguir los tutoriales hasta un punto, pero en última instancia tienen problemas para conciliar las diferencias.

Soy ciertamente nuevo en esto así que si alguien podría apenas darme una descripción de alto nivel de qué se debe hacer para lograr esto, realmente lo apreciaría. El código siguiente es donde actualmente estoy agregando el mapa de bits al ImageView. Supongo que mi llamada al hilo separado iría en onCreate ?

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_image); Bitmap bm = BitmapFactory.decodeFile(MainActivity.image_path); displayImageView = (ImageView) findViewById(R.id.myImageView); displayImageView.setImageBitmap(bm); } 

Utilice ExifInterface para girar

 picturePath = getIntent().getStringExtra("path"); Bitmap bitmap = BitmapFactory.decodeFile(picturePath); ExifInterface exif = new ExifInterface(picturePath); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); Matrix matrix = new Matrix(); switch (orientation) { 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; default: break; } myImageView.setImageBitmap(bitmap); bitmap.recycle(); 

Nota: Aquí se selecciona picturePath imagen de la Gallery

  • tutorial

¿Por qué molestarse en girar la imagen. Como dijiste: "El ImageView está orientado correctamente, solo que la imagen en su interior se muestra siempre a 90 grados en sentido contrario a las agujas del reloj.", Entonces haz que el ImageView gire 90 grados en el sentido de las agujas del reloj.

  displayImageView.setRotation(90); 

Puede girar una imagen utilizando una matriz o establecer la rotación en su xml. Si desea más control sin embargo, puede revisar este tutorial escrito para girar imágenes y guardar en disco:

Cómo rotar una imagen en android

Espero que ayudó.

Pude conseguirlo trabajando con el siguiente acercamiento. Creo que podría hacer esto sin el AsyncTask, pero parece que la mejor práctica establece que debe realizar el procesamiento de imágenes en un hilo no UI (por favor, no dude en corregir – Soy bastante nuevo en esto).

Una mejora que se podría hacer a esto sería manejar la escala de una manera más granular. inSampleSize es una gran herramienta, pero sólo escalará por potencias de 2. Otra mejora sería inicialmente sólo leer los datos meta / EXIF ​​en bmOriginal como el único uso de esta variable es recuperar la altura y el ancho.

ImageView XML – prácticamente estándar. Android: layout_width / height establecido en fill_parent .

Desde el archivo java de la actividad –

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_image); new ImageRotator().execute(MainActivity.image_path); } private class ImageRotator extends AsyncTask<String, Void, Bitmap>{ protected Bitmap doInBackground(String... image_path){ BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = 4; Bitmap bmOriginal = BitmapFactory.decodeFile(image_path[0], bitmapOptions); Matrix matrix = new Matrix(); matrix.postRotate(90); bmOriginal = Bitmap.createBitmap(bmOriginal, 0, 0, bmOriginal.getWidth(), bmOriginal.getHeight(), matrix, true); return bmOriginal; } protected void onPostExecute(Bitmap result) { myImageView = (ImageView) findViewById(R.id.myImageView); myImageView.setImageBitmap(result); } } 

El proceso de escalado se encontró aquí y aquí hay una gran explicación de las características de AsyncTask aquí .

Muchas gracias a todos los que respondieron y de nuevo – por favor siéntase libre de hacerme saber si esto es manera de base o incluso si sólo hay una mejor manera de hacer esto.

  • Error de bucle en el emulador de Android
  • Limitaciones de proto buffers - carga de datos parciales y compartir secuencias
  • Cómo hacer http obtener solicitud en Android
  • Intellij 13 Auto doc pop-up en la solución mouseover ya no funciona
  • Android.support.v7.widget.AppCompatTextView no se puede convertir en android.widget.RelativeLayout
  • GC_FOR_ALLOC es más "serio" al investigar el uso de la memoria?
  • Android: ¿Todas las actividades de una aplicación para Android se ejecutan en el mismo subproceso o en subprocesos separados?
  • Retrato para teléfono, paisaje para Tablet (Android-Layout)
  • Variables en los recursos XML: pasa valores de padres a hijos
  • Estoy haciendo las lecciones de "primera aplicación" en desarrolladores de Android, pero la aplicación no se ejecutará.
  • ¿Cómo envío un archivo csv / texto desde un teléfono Android a una impresora wifi?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.