¿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í:

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?

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).

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.