2021SC@SDUSC
目录
案例——draw_compare
BitmapCompareUtil类
getLookLikeColorPixel方法
private static int getLookLikePaintColorPixel(Bitmap target, final int startX, final int startY, final List<Point> data, final int[][] table) {
final int[] darkColorCount = {0};
getBitmapPixelColor(target, new PixelColorHandler() {
@Override
public void onHandle(Bitmap target, int index, int x, int y, int r, int g, int b) {
if (table != null)
table[y][x] = 1;
if (data != null)
data.add(new Point(startX + x, startY + y));
++darkColorCount[0];
}
});
return darkColorCount[0];
}
这个方法主要用于获取目标bitmap近似画笔颜色的像素点。
其中target为目标bitmap,startX为bitmap在canvas上的x轴,startY为bitmap在canvas中的y轴,data获取到的像素点 以List的形式,table为获取到的像素点 以二位数组的形式。
getBitmapPixelColor方法
private static void getBitmapPixelColor(Bitmap target, PixelColorHandler handler) {
if (checkBitmapCanUse(target) && handler != null) {
int width = target.getWidth(), height = target.getHeight();
int[] targetPixels = new int[width * height];
//获取bitmap所有像素点
target.getPixels(targetPixels, 0, width, 0, 0, width, height);
int index = 0;
int pixelColor;
int r, g, b;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
//获取rgb色值并与目标颜色相比较
pixelColor = targetPixels[index];
r = Color.red(pixelColor);
g = Color.green(pixelColor);
b = Color.blue(pixelColor);
if (isLookLikePaintColor(r, g, b))
handler.onHandle(target, index, x, y, r, g, b);
++index;
}
}
}
}
该方法用于获取bitmap近似画笔颜色。参数target时目标bitmap,handler是回调接口。
通过checkBitMapCanUse方法来检查目标bitmap是否可用,如果目标bitmap可用并且回调接口不为空,则获取目标bitmap的width和height值,然后创建数组用于获取到目标bitmap的所有像素点。再定义所需变量,然后遍历获取到RGB色值并于目标颜色相比较。比较所有的方法是isLookLikePaintColor方法。
checkBitMapCanUse方法
checkBitmapCanUse方法为检查目标bitmap是否可用的方法,返回的布尔值为Bitmap对象target不为空并且未被回收。
private static boolean checkBitmapCanUse(Bitmap target) {
return target != null && !target.isRecycled();
}
关于Bitmap的recycle问题:
虽然Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定。如果只是使用少量的几张图片,回收与否关系不大。可是若有大量bitmap需要垃圾回收处理,那必然垃圾回收需要做的次数就更多也发生地更频繁,会对系统资源造成负荷。所以,这个时候还是自己使用recycle来释放的比较好。
如何使用recycle方法和何时使用recycle方法都是值得考虑的事情,否则,就很容易出现异常,例如试图使用一个已经回收了的图片,这也正是上面getBitmapPixelColor方法中要判断bitmap是否已经回收的原因。