支付宝AR红包线索图处理

作者: Brian512 | 来源:发表于2016-12-27 12:36 被阅读197次

    上周支付宝退出AR红包,玩法确实不错,但是上线当天就被操翻了。笔者是周五开始玩的,当天同事说可以直接扫线索图片打开红包,由于线索图添加了防作弊的黑色条纹,所以笔者试了好多次都没打开一个,于是就放弃了。哪知下班回家在公交上在头条看到文章讲如何处理线索图增大打开红包的几率:
    1.将线索图片复制一份,透明度设置为50%;
    2.覆盖在原图上,并向下偏移几像素;
    3.将合成后的图片用高斯模糊处理,半径设置为1像素;
    由于支付宝为降低图片识别度,而把线索图的亮度降低了,我们在还原线索图时可以适当增加图片的亮度。
    看到这里,既然会写代码,就跃跃欲试,回到家迫不及待的打开电脑开始撸代码。
    首先,我们需要把线索图取出来,解决办法就是收到全屏截图,然后从截图中截取线索图部分,因为每次线索图的位置都是固定的,所以写死就好了。

        public static Bitmap clipBitmap(Bitmap source, int x, int y, int width, int height) {
            if (source == null || source.isRecycled()) {
                return null;
            }
    
            if (width <= 0 || height <= 0) {
                throw new IllegalArgumentException("size is error");
            }
            try {
                return Bitmap.createBitmap(source, x, y, width, height);
            } catch (Exception e) {
                System.gc();
                return null;
            }
        }
    

    拿到线索图后,就是进入图片处理咯:

        private Bitmap getDealedImage(Bitmap sourceBitmap, int bright, int transparent, float blurR, int offset) {
    
            dealPixels(sourceBitmap); // 处理线索图,后期添加,可以先忽略
    
            Bitmap secondBitmap = getTransparentBitmap(sourceBitmap, transparent); // 拷贝一份半透明的
            Bitmap bitmap = Bitmap.createBitmap(sourceBitmap.getWidth(), sourceBitmap.getHeight() + offset, Bitmap.Config.ARGB_8888); // 创建最终结果图片
            Rect baseRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); // 结果图片绘制区
            Rect sourceRect = new Rect(0, 0, secondBitmap.getWidth(), secondBitmap.getHeight()); // 线索图绘制区
            Rect secondRect = new Rect(0, offset, secondBitmap.getWidth(), secondBitmap.getHeight()+offset); // 半透明的图绘制区,已经偏移了
    
            Canvas canvas = new Canvas(bitmap);
            canvas.drawBitmap(sourceBitmap, sourceRect, baseRect, getBrightPaint(bright)); // 绘制图片时提高亮度
            canvas.drawBitmap(secondBitmap, secondRect, baseRect, getBrightPaint(bright));
    
            return BitmapUtil.blurBitmapUseSysApi(bitmap, blurR); // 模糊处理
        }
        
        public static Paint getBrightPaint(int brightness) {
            ColorMatrix cMatrix = new ColorMatrix();
            cMatrix.set(new float[] { 1, 0, 0, 0, brightness, 0, 1,
                    0, 0, brightness,// 改变亮度
                    0, 0, 1, 0, brightness, 0, 0, 0, 1, 0 });
    
            Paint paint = new Paint();
            paint.setColorFilter(new ColorMatrixColorFilter(cMatrix));
            return paint;
        }
    

    这里是最核心处理,完成之后把附近的红包都扫了一遍,成功率很高。虽然刚开始玩都是小红包,但是成就感还是不小,哈哈哈。特别是有些很私密的红包被打开后,还答谢调戏一下,哈哈哈。

    后面为了完善体验,减少操作步骤,有做了些处理,自动读取截屏存储目录之类的。
    当然为了更完善,我把所有调节参数都增加了配置入口,便于对一些特殊图片单独调节。

    看上去如何,哈哈哈

    做出来之后好兴奋,感觉找到一条发家致富之路了,但是第二天就发现支付宝增加了红包上限,每天最多只能领取10个红包。并且线索图的干扰线条越来越密了。但是这个方法还是可以打开红包,只是概率降低了一些而已。

    下面把代码奉上,大家随便玩吧!
    https://github.com/brian512/AndroidDemo

    相关文章

      网友评论

        本文标题:支付宝AR红包线索图处理

        本文链接:https://www.haomeiwen.com/subject/xnosvttx.html