如何高效地将一个Bitmap对象读入一个二维整型数组?
How to efficiently read a Bitmap object into a two-dimensional integer array?
我需要在我的 Android 应用程序中将整个位图对象读入二维整数数组。
目前,我正在单独读取每个像素,一次一个,如下所示:
for (int y = 0; y < coverImageHeight; y++)
{
for (int x = 0; x < coverImageWidth; x++)
{
coverImageIntArray[x][y] = coverImageBitmap.getPixel(x, y);
}
}
但是,这在大图像上需要很长时间(大约 15 秒)。
有没有办法一次性搞定效率更高?
我不熟悉 Android dev,但通常对于图像对象,您可以只获取某个底层缓冲区的引用或副本。这个缓冲区通常是一维的,但你应该可以 covert it fairly easily. In your case, for grabbing the pixels, there's a function getPixels 看起来很完美。
int[] coverImageIntArray1D = new int[coverImageWidth * coverImageHeight]
coverImageBitmap.getPixels(coverImageIntArray1D, 0, coverImageWidth,
0, 0, coverImageWidth, coverImageHeight)
// coverImageIntArray1D should now contain the entire image's pixels
仅供参考,您可以使用二维索引对此类一维数组进行索引:
int pixel = coverImageIntArray1D[x + y*coverImageWidth]
这将为您提供 [x][y]
处的像素。因此,您仍然可以以二维方式使用它,而无需执行低效的转换。
我刚刚查看了一个涉及OCR的旧项目,并使用了您在回答中提供的方法。不过,我的图片只有 28x28 像素。
使用 getPixels()
可能更快。
参见void getPixels (int[] pixels,
整数偏移量,
跨步,
诠释 x,
诠释y,
整数宽度,
整数高度)
代码可能看起来像
bitmap.getPixels(intArray, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight());
这会将位图 Color 值复制到 int 数组中。
不使用二维数组,而是考虑使用一些 for 循环逻辑和一个一维数组
void getPixels (int[] pixels,
int offset,
int stride,
int x,
int y,
int width,
int height)
这种方法应该比尝试将一维数组拆分为二维数组更高效,因为您要转换像素数据,它似乎在内部存储为 int[]
, 到 int[][]
, 只是为了稍微简化你的逻辑。
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]);
分别查看 Android 开发人员参考 Bitmap.getPixels(int[], int, int, int, int, int, int) and Color.valueOf(int) (to extract single color components, Color.alpha(int), Color.red(int), Color.green(int) and Color.blue(int)。
我需要在我的 Android 应用程序中将整个位图对象读入二维整数数组。
目前,我正在单独读取每个像素,一次一个,如下所示:
for (int y = 0; y < coverImageHeight; y++)
{
for (int x = 0; x < coverImageWidth; x++)
{
coverImageIntArray[x][y] = coverImageBitmap.getPixel(x, y);
}
}
但是,这在大图像上需要很长时间(大约 15 秒)。
有没有办法一次性搞定效率更高?
我不熟悉 Android dev,但通常对于图像对象,您可以只获取某个底层缓冲区的引用或副本。这个缓冲区通常是一维的,但你应该可以 covert it fairly easily. In your case, for grabbing the pixels, there's a function getPixels 看起来很完美。
int[] coverImageIntArray1D = new int[coverImageWidth * coverImageHeight]
coverImageBitmap.getPixels(coverImageIntArray1D, 0, coverImageWidth,
0, 0, coverImageWidth, coverImageHeight)
// coverImageIntArray1D should now contain the entire image's pixels
仅供参考,您可以使用二维索引对此类一维数组进行索引:
int pixel = coverImageIntArray1D[x + y*coverImageWidth]
这将为您提供 [x][y]
处的像素。因此,您仍然可以以二维方式使用它,而无需执行低效的转换。
我刚刚查看了一个涉及OCR的旧项目,并使用了您在回答中提供的方法。不过,我的图片只有 28x28 像素。
使用 getPixels()
可能更快。
参见void getPixels (int[] pixels, 整数偏移量, 跨步, 诠释 x, 诠释y, 整数宽度, 整数高度)
代码可能看起来像
bitmap.getPixels(intArray, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight());
这会将位图 Color 值复制到 int 数组中。
不使用二维数组,而是考虑使用一些 for 循环逻辑和一个一维数组
void getPixels (int[] pixels,
int offset,
int stride,
int x,
int y,
int width,
int height)
这种方法应该比尝试将一维数组拆分为二维数组更高效,因为您要转换像素数据,它似乎在内部存储为 int[]
, 到 int[][]
, 只是为了稍微简化你的逻辑。
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]);
分别查看 Android 开发人员参考 Bitmap.getPixels(int[], int, int, int, int, int, int) and Color.valueOf(int) (to extract single color components, Color.alpha(int), Color.red(int), Color.green(int) and Color.blue(int)。