mostrar imágenes enormes en Android

Tengo la intención de mostrar imágenes muy grandes en Android.

Mi primera solución , suministrarlos en formato pdf, falla porque no todos los dispositivos de mano tienen preinstalado un visor de PDF, y no deseo que los usuarios instalen uno.

Entonces tengo un png ahora (ancho = 3998px altura = 2827px) que quiero mostrar. Descargué esta imagen para probar cómo se mostraría en la galería. Fue bastante doloroso. Parece que la galería muestra esta imagen solo una vez, y si amplío, no puedo leer el texto.

Así que escribí TestActivity que simplemente tiene un ImageView nested en LinearLayout. Puse la imagen en el dibujo y la configuré como fuente de imagen de ImageView. Desafortunadamente, la aplicación falla inmediatamente, debido a un ”

ERROR/AndroidRuntime(8906): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget" 

No esperaba que UNA sola imagen pudiera ser demasiado grande para VM's memory . 3998 & 2827px un poco, establecí el tamaño de ImageViews en 3998 & 2827px , coloqué la imagen en sdCard y la leí manualmente con un fileInputStream .
Para mi gran sorpresa ahora muestra mi imagen, pero si OutOfMemoryError mi Nexus S horizontal obtengo el mismo OutOfMemoryError que antes.

¿Puede alguien señalarme la principal diferencia entre recibir un bitmap a través de FileInputStream o establecerlo como fuente ImageView's ?

Además, no puedo desplazarme cómodamente con dos scrollViews principales

Estoy buscando una solución simple para mostrar ONE large image a la vez con la capacidad de scroll horizontal and vertical mientras que puede acercarse y alejarse.

Aquí hay una muestra de la imagen que quiero mostrar enter image description here

Sé que es una publicación anterior, pero pasé mucho tiempo con este problema, así que aquí está mi solución.

Quería mostrar una imagen de 2000 × 3000 pero me quedé sin memoria o la imagen era demasiado grande para mostrarla.

Para comenzar, obtengo las dimensiones de la imagen:

 o = new BitmapFactory.Options(); o.inJustDecodeBounds=true; pictures = BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

Luego lo corté en cuatro partes y las mostré con cuatro ImageViews. Intenté cargar la imagen completa y cortarla en cuatro (usando BitmapFactory.create(bitmap,int,int,int,int) ) pero salí de la memoria de nuevo.

Así que decidí usar BitMapRegionDecoder:

 for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { ImageView iv = new ImageView(this); InputStream istream = null; try { istream = this.getContentResolver().openInputStream(Uri.fromFile(f)); } catch (FileNotFoundException e1) { e1.printStackTrace(); } BitmapRegionDecoder decoder = null; try { decoder = BitmapRegionDecoder.newInstance(istream, false); } catch (IOException e) { e.printStackTrace(); } int nw = (j*width/k); int nh = (i*height/k); Bitmap bMap = decoder.decodeRegion(new Rect(nw,nh, (nw+width/k),(nh+height/k)), null); iv.setImageBitmap(bMap); } } 

Esto funcionó.

Sé que es una vieja pregunta, pero utilicé TileView para hacer exactamente esto:

https://github.com/moagrius/TileView

Intenta usar este: https://github.com/davemorrissey/subsampling-scale-image-view

Una vista de imagen personalizada para Android, diseñada para galerías de fotos y que muestra imágenes enormes (por ejemplo, mapas y planos de construcción) sin OutOfMemoryErrors. Incluye un pellizco para ampliar, paneo, rotación y soporte de animación, y permite una extensión fácil para que pueda agregar sus propias superposiciones y tocar la detección de eventos.

Puede usar esta fuente “fácil de integrar” de la aplicación WorldMap:

https://github.com/johnnylambada/WorldMap

Utiliza una imagen enorme de un mapa mundial y utiliza la memoria caché para mostrar un mapa.

Para integrar, simplemente copié todos los archivos java (5 supongo) y usé SurfaceView en mi archivo de diseño. Luego revisé el pequeño método OnCreate () de ImageViewerActivity.java y usé el código en mi actividad (con ligeras modificaciones, dependiendo de mi uso personal).

Esta publicación es una buena demostración para hacer zoom en una imagen usando gestos multitáctiles. Utiliza Matrix para acercar o alejar una imagen.

Para manejar escalas, etc. y usar resolución completa, puede usar MapView de OSM (abrir el mapa de calles) y proporcionarle sus mosaicos (en lugar del mapa). Mira esto: http://www.haakseth.com/?p=30

Tenemos que seguir los siguientes pasos para eliminar la excepción de falta de memoria al cargar imágenes de gran tamaño:

  1. Read Bitmap Dimensions and Type 2. Load a Scaled down version into memory 

La Guía del desarrollador de Android define cómo logramos. aqui esta el link

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap