¿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.
- Umbral en Android con opencv
- Android: cómo deformar imágenes?
- Android Yuv420sp a ARGB en OpenCV
- Cómo cambiar el color de fondo de mapa de bits a transparente y de fondo no debe arrastrar?
- Cortar la imagen después de seleccionar el área mediante la detección de bordes en android
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?
- Croping la imagen en android usando opencv
- Android: Imagen sobre imagen
- Píxeles de la cámara girados
- Hacer que la imagen superpuesta sea transparente al tocar en Android?
- Cómo obtener el objeto Mat desde el byte en openCV android?
- Detección de objetos Android OpenCV
- Tiempo de procesamiento de OpenCV Mat
- OpenCV - Java: función inRange
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.
- Api de audio de baja latencia para Android?
- No se puede arrastrar y soltar una imagen simple en el estudio android