Cómo cargar baldosas de un mapa de bits grande en Android?

Si tengo un archivo de mapa de bits grande que normalmente generaría una excepción "Fuera de memoria", ¿cómo puedo cargarlo como mosaicos? Por ejemplo, tengo una imagen de 10.000×10.000, quiero dividirlo en una cuadrícula de 10×10 de 1.000×1.000 píxeles.

He visto la función Bitmap.createBitmap(sourceBitmap, x, y, width, height) pero requiere mi imagen grande como fuente de entrada.

¿Cómo puedo obtener un mosaico de mi imagen de entrada, sin cargar completamente la imagen de entrada?

Respuesta de Romain Guy en ¿Es posible cortar un mapa de bits a piezas pequeñas sin cargar la cosa entera en la memoria? :

Android 2.3.3 tiene una nueva API llamada android.graphics.BitmapRegionDecoder que te permite hacer exactamente lo que quieres.

Por ejemplo, haga lo siguiente:

 BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false); Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null); 

Fácil

Si tienes mucha suerte, puedes encontrar una biblioteca que puede cargar trozos de una imagen de almacenamiento en lugar de cargar todo. Depende del formato de la imagen y de las bibliotecas disponibles para leerlo. Además, la biblioteca probablemente se escribirá en C, por lo que tendrá que portar a Java o utilizar el NDK.

Sería mucho mejor romper la imagen en azulejos antes de que se coloque en el teléfono.

Si ninguna de estas opciones funciona para usted, creo que no tiene suerte.

Si la imagen se almacena como un mapa de bits comprimido, es prácticamente imposible calcular dónde se encuentra una región particular de la imagen en el archivo. Para encontrar una región en particular, decodificaría línea por línea, arrojando los resultados hasta llegar a la fila y. A continuación, continuar la decodificación de las filas de altura, arrojando los píxeles a la izquierda de su coordenada X y a la derecha de X + width …. muy lento si está panning en la parte inferior de un gran mapa de bits.

Leyendo entre las líneas, parece que el BitmapRegionDecoder () mencionado anteriormente hace esto en el fondo si 'isShareable' es cierto. De lo contrario parece que puede descomprimir la imagen, y almacenar la copia sin comprimir. Con 1 byte por píxel, tardará 100MB para sostener su mapa de bits 10,000×10,000.

  • Android: Pasar un mapa hash entre las actividades
  • Causado por: java.lang.OutOfMemoryError: tamaño de mapa de bits supera el presupuesto de VM
  • Android - Bitmap y gestión de la memoria?
  • Obtener las líneas de GL10 dibujo de imágenes junto a la otra, la solución?
  • Mapbox Android determina el nivel de zoom que contiene todos los marcadores
  • Cómo obtener el nombre de la ciudad por latitud y longitud en android?
  • Mostrar una ubicación geográfica mediante webview
  • Extraño problema MapView; Error de PixelConverter
  • Mapa sin conexión usando mapsforge en android
  • Cómo mostrar la barra de escala de mapa en el mapa android v2
  • Lona: intentando usar un mapa de bits reciclado android.graphics.Bitmap
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.