移动互联网开发教学案例学习-10

2021SC@SDUSC

目录

 案例——draw_compare

BitmapCompareUtil类

getLookLikeColorPixel方法

getBitmapPixelColor方法

checkBitMapCanUse方法


案例——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是否已经回收的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值