如果要遍历一张图片的所有像素的(比如二值化),可以用两个for循环嵌套通过Bitmap中的getPixel(x,y)方法获取对应点的像素值即可。还有一种方法是通过Bitmap中的getPixels(pixels, offset, stride, x, y, width, height)方法获取一维数组pixels,然后在遍历pixels。经过测试,我发现后者方法遍历像素点效率大大高于前者。见如下示例:
// 获取一张宽384的图片,E为图片路径
bmp = Utils.getSmallBitmap(E, 384);
int w = bmp.getWidth();
int h = bmp.getHeight();
{
long start = System.currentTimeMillis();
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
//获取像素随便赋值给q
int q = bmp.getPixel(i, j);
}
}
long end = System.currentTimeMillis();
System.out.println("1: "+(end-start));
}
{
long start = System.currentTimeMillis();
int[] a = ArrayPictureUtils.bitmap2Array(bmp);
// 为了遍历一维数组图片像素如同遍历二维数组图片像素一样,
// 所以使用了两个for语句嵌套,如果不在乎像素的坐标,一个
// for语句即可,效率会更高
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
int q = a[w*j+i];
}
}
long end = System.currentTimeMillis();
System.out.println("2: "+(end-start));
}
最后运行的结果如下:
明显后者效率高于前者。