¿Es posible cortar un mapa de bits a piezas pequeñas sin cargar toda la cosa en la memoria?

Estoy trabajando en una aplicación de procesamiento de imágenes para Android que reconoce la notación musical de las fotos tomadas de las hojas de música.

He intentado cargar toda la imagen en un mapa de bits utilizando el método BitmapFactory.decodeFile (imgPath) , pero como mi teléfono no tiene suficiente memoria, obtengo un error de "tamaño de heap de VM". Para evitar esto, me gustaría cortar la imagen completa en pedazos más pequeños, pero no estoy seguro de cómo hacerlo.

También vi que era posible reducir el tamaño de la memoria del mapa de bits usando la propiedad inSampleSize de la clase de BitmapFactory.Option, pero si hago eso no conseguiré la imagen de alta resolución que necesito para el proceso de reconocimiento de la notación de la música.

¿Hay alguna manera de manejar esto sin ir a NDK?

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 es de una cámara la imagen probablemente será formato jpeg. Usted podría utilizar una biblioteca jpeg externa – ya sea en java oa través de la NDK, lo que sea que pueda encontrar – para darle un mejor control y cargar una pieza a la vez. Si lo necesitas como un android.graphics.Bitmap entonces sospecho que entonces tendrá que volver a codificar la subimagen como PNG o JPEG y pasarlo a BitmapFactory.decodeByteArray() . (Si la memoria es una preocupación, entonces asegúrese de olvidar sus referencias a las piezas del mapa de bits con prontitud para que el recolector de basura se puede ejecutar con eficacia.)

La misma técnica también funcionará si el gráfico de entrada es de formato PNG, o casi cualquier otra cosa siempre que se pueda encontrar un código de decodificación adecuado para él.

Creo que al cargar la imagen por pieza que está configurando un desafío algorítmico para decidir qué partes de la que realmente están interesados ​​en el detalle completo de. Me doy cuenta de que BitmapFactory.Options incluye la opción de submuestra, que podría ser útil si desea analizar una visión general de la imagen para decidir qué regiones cargar en detalle.

Si se trata de imágenes JPEG, vea mi respuesta a esta pregunta , así como este ejemplo .

No sé cómo es posible obtener libijg en Android, pero si lo es, entonces vale la pena una inyección.

  • Procesamiento de datos de la vista previa de la cámara con Android L y Camera2 API
  • Android: BitmapFactory.decodeByteArray ofrece bitmap pixelado
  • Convertir imagen JPEG / PNG a formato de imagen TIFF en Android OS
  • Animar la imagen de la cara - usando deformación?
  • Android - openCV, obtener parte de la imagen - comportamiento extraño
  • Uso de ImageMagick en mi aplicación Android
  • Cuadros de bits en escala de grises en android
  • ¿Hay un puerto de ImageMagick disponible para Android?
  • Reconocimiento de monedas en Android
  • Dilatación y erosión en Android
  • Android Paper Detection con OpenCV
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.