Red de conocimiento informático - Consumibles informáticos - Registros de problemas de OOM causados ​​por createBitmap frecuente

Registros de problemas de OOM causados ​​por createBitmap frecuente

Actualmente estoy trabajando en una aplicación relacionada con la cámara. En términos generales, es necesario girar la salida de la cámara para que se convierta en una imagen orientada hacia adelante. Esto se debe a que el sistema de coordenadas del sensor de la cámara es inconsistente. con la pantalla Sí, no entraré en detalles. Sin embargo, vale la pena registrar una serie de problemas causados ​​por la salida de imágenes.

En primer lugar, la salida de vista previa de la imagen es muy lenta y está bloqueada. En este momento, debe prestar atención. No utilice ImageFormat.JPEG como formato de salida de ImageReader. Supongo que la razón es que si la cámara emite en formato JPEG, todavía necesitamos hacer una transcodificación, lo que fácilmente puede causar retrasos en teléfonos móviles de bajo rendimiento. Si el formato aún persiste después de cambiarlo, considere reducir la resolución. salida de imagen. En cuanto a convertir YUV a Bitmap, puede encontrar una biblioteca C en línea, que tiene un rendimiento mayor que la salida directa de JPEG a Bitmap.

El siguiente paso es que la dirección de la imagen no coincide con la de la pantalla. Cuando se busca en línea un mapa de bits giratorio, básicamente dicen que se use

para crear un nuevo mapa de bits y luego liberarlo. En este momento, surge el problema del mapa de bits original. Está bien usarlo así en tiempos normales, pero hay un problema cuando se emite la vista previa de la cámara, porque la velocidad de salida de la vista previa de la cámara es muy rápida. el mapa de bits no tendrá tiempo de liberarlo y lentamente perderá memoria hasta que finalmente se produzca un desbordamiento de memoria. Además, la creación de Bitmap consume mucha memoria. Cuando se crea Bitmap con frecuencia, el consumo de memoria es muy rápido. En este momento, podemos elegir otra forma, que rara vez se menciona en Internet, para rotar Bitmap. utilizar lienzo.

Sabemos que se puede pasar Bitmap cuando se crea Canvas. En este momento, todos los dibujos en Canvas se dibujarán directamente en Bitmap, y Canvas también tiene un método drawBitmap, y se pueden usar otros mapas de bits. Más importante aún, uno de los métodos sobrecargados de drawBitmap se puede pasar en Matrix, y la solución aparece en este momento. Podemos crear un mapa de bits reutilizado globalmente, prestar atención al tamaño rotado y luego usarlo para crear Canvas. y luego No es necesario que todas las rotaciones de mapas de bits generen un nuevo mapa de bits, solo use canvas.drawBitmap para dibujar en el mapa de bits global. Pero esto aún no ha terminado.

El tamaño del lienzo creado a través de Bitmap es el tamaño del Bitmap. Cuando rotamos el mapa de bits, debemos prestar atención al hecho de que la posición del pincel Bitmap cambiará cuando Matrix esté. ​girado.El dibujo final se puede enviar al mapa de bits. Puede que solo haya una pequeña parte, o incluso ninguna, dibujada en el mapa de bits. En este momento, necesitamos agregar una operación de desplazamiento en Matrix para mantener la posición de salida del pincel consistente con el lienzo. Debe calcular la distancia de desplazamiento específica usted mismo, porque me he olvidado de la generación de líneas, por lo que mi enfoque es tomar dos. Papel, gíralo tú mismo y comprueba la posición...

En este punto, todos los problemas causados ​​por la salida de la imagen de la cámara se han resuelto. Acabo de escribir estos pocos pasos, pero me quedé atascado cuando estaba. Buscando a tientas, me tomó medio día encontrar registros de problemas relevantes en línea, así que los registré para no olvidarlos.

——Puede usar la biblioteca libyuv para convertir YUV a mapa de bits, y la operación de rotación también se puede completar a través de esta biblioteca. Si es posible, es mejor no usar Java para la rotación.