¿Cómo leer eficientemente un objeto Bitmap en una matriz de números enteros bidimensionales?
Necesito leer la totalidad de un objeto Bitmap en una matriz de números enteros bidimensionales en mi aplicación de Android.
Actualmente, estoy leyendo cada píxel individualmente, uno a la vez, así:
- ¿Cómo insertar valores en matriz bidimensional de forma programática?
- Cómo almacenar elementos seleccionados de un ExpandableListView en un ArrayList
- ¿Cómo crear matriz multidimensional?
- ExpandableListView con opción múltiple guardar el elemento seleccionado en un array
- Inicializar Array en una matriz
for (int y = 0; y < coverImageHeight; y++) { for (int x = 0; x < coverImageWidth; x++) { coverImageIntArray[x][y] = coverImageBitmap.getPixel(x, y); } }
Sin embargo, esto tarda mucho tiempo en imágenes grandes (unos 15 segundos).
¿Hay una manera de hacerlo todo de una sola vez para una mejor eficiencia?
- Cómo recuperar array multidimensional usando json en android
- Android: Uso de la matriz de cadenas multidimensionales para la lista
- Anidados if / else, switches o algo más eficiente para el combate RPG?
- Android: Ayuda bidimensional de ArrayList
- Convierta la matriz de cadenas 2d en ArrayList en android
- Arreglo de ordenadores de Android
- Pase la matriz 2D a otra actividad
No estoy familiarizado con Android dev, pero normalmente para los objetos de imagen que son capaces de sólo agarrar una referencia o copia de algún buffer subyacente. Este buffer normalmente es 1D, pero debería ser capaz de encubrirlo con bastante facilidad. En su caso, para capturar los píxeles, hay una función getPixels que parece perfecta.
int[] coverImageIntArray1D = new int[coverImageWidth * coverImageHeight] coverImageBitmap.getPixels(coverImageIntArray1D, 0, coverImageWidth, 0, 0, coverImageWidth, coverImageHeight) // coverImageIntArray1D should now contain the entire image's pixels
FYI, puede indexar en este tipo de matriz 1D utilizando índices 2D:
int pixel = coverImageIntArray1D[x + y*coverImageWidth]
Que le dará el píxel en [x][y]
. Así que todavía puede usarlo de una manera 2D sin realizar una transformación ineficiente.
Acabo de revisar un proyecto antiguo que hice involucrando OCR, y usé el método que usted presenta en su respuesta. Mis imágenes eran sólo 28×28 píxeles, sin embargo.
Es probable que el uso de getPixels()
sea más rápido.
Ver void getPixels (int [] píxeles, int offset, int stride, int x, int y, int width, int height)
El código podría ser similar a
bitmap.getPixels(intArray, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight());
Esto copiará los valores de color de mapa de bits en la matriz de int.
En lugar de usar una matriz bidimensional, considere el uso de un poco de lógica for-loop y una matriz unidimensional con
void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)
Este enfoque debería ser mucho más eficiente que tratar de dividir una matriz unidimensional en matrices bidimensionales, ya que estaría convirtiendo los datos de píxeles, que parece estar internamente almacenados como int[]
, a un int[][]
, sólo para simplificar ligeramente su lógica.
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); for (int row = 0; row < bitmap.getHeight(); row++) for (int column = 0; column < bitmap.getWidth(); column++) Color color = Color.valueOf(pixels[row * bitMap.getWidth() + column]);
Eche un vistazo a la referencia de desarrolladores de Android para Bitmap.getPixels (int [], int, int, int, int, int, int) y Color.valueOf (int) (para extraer componentes de color único, Color.alpha (int) Color.red (int) , Color.green (int) y Color.blue (int), respectivamente).