¿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.
- Filtro esférico en android
- Error: No se puede obtener un lockedBuffer, el cliente muy probable intenta bloquear más de buffers maxImages
- Dilatación y erosión en Android
- Obtener el color del píxel tocado desde la vista previa de la cámara
- Android Asynctask para procesar tramas de video en vivo
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?
- Comparar dos imágenes en android
- Encuentra color dominante en un marco de cámara en OpenCV Android
- Transmisión de matriz a rsForEach en Renderscript Compute
- Calcular la relación de aspecto de la imagen de destino Transformar perspectiva
- Android jpeg pictureCallback en escala de grises Opencv Mat
- Cambiar el color de un objeto en una aplicación de Android
- ¿Hay alguna biblioteca de efectos de imagen (por ejemplo, lomo) para Android o iPhone?
- Reconocimiento y seguimiento de objetos en movimiento más rápido en Android
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