安卓支付宝红包密码的图片的处理实践_图文

时间:2021-05-14 08:55:16

有一天,群里面有一个群员发来一个图片,图片上面有支付宝红包的密码,于是我就想能不能做成类似于抢QQ红包一样的东西,经过几天的实践,思路如下:

1.      监听QQ群或者微信群里的图片红包消息(使用AccessibilityService)

2.      手动点击图片进入查看图片详情,AccessibilityService里面处理把图片剪切成只有密码文字的图片的动作

3.      对剪切后的图片进行去燥处理(本文重点)

4.      使用google开源框架Tesseract-OCR进行常见样本训练,把自己要用到的词都训练进去

(我在win7上使用到的软件tesseract.exe和jTessBoxEditorFX)

5.      把训练出来的结果(名字如chi_sim.traineddata)放到android项目中的Tesseract-OCR指定目录(一般为sd卡/tesseract)

6.      使用Tesseract-OCR开源框架进行步骤3图片的识别

7.      识别成功后调用支付宝软件,点开红包界面,把步骤6的识别出来的密码文字,粘贴到密码框中,点击确定(这个可以手动做,因为识别的密码有可能部分错误)

 

本篇重点介绍对剪切后的图片进行去燥处理步骤:

1.      找到一个支付宝保存的图片

       安卓支付宝红包密码的图片的处理实践_图文

2.      把他的密码通过android剪切功能弄出来(网上很多办法),如图

       安卓支付宝红包密码的图片的处理实践_图文

3.      对它进行线性灰度变化,代码如下

 

    public Bitmap lineGrey(Bitmap image)

    {

        //得到图像的宽度和长度

        int width = image.getWidth();

        int height = image.getHeight();

        //创建线性拉升灰度图像

        Bitmap linegray = null;

        linegray =image.copy(Bitmap.Config.ARGB_8888, true);

        //依次循环对图像的像素进行处理

        for (int i = 0; i < width; i++) {

            for (int j = 0; j < height; j++){

                //得到每点的像素值

                int col = image.getPixel(i, j);

                int alpha = col & 0xFF000000;

                int red = (col &0x00FF0000) >> 16;

                int green = (col &0x0000FF00) >> 8;

                int blue = (col &0x000000FF);

                // 增加了图像的亮度

                red = (int) (1.1 * red + 30);

                green = (int) (1.1 * green +30);

                blue = (int) (1.1 * blue + 30);

                //对图像像素越界进行处理

                if (red >= 255)

                {

                    red = 255;

                }

 

                if (green >= 255) {

                    green = 255;

                }

 

                if (blue >= 255) {

                    blue = 255;

                }

                // 新的ARGB

                int newColor = alpha | (red<< 16) | (green << 8) | blue;

                //设置新图像的RGB值

                linegray.setPixel(i, j,newColor);

            }

        }

        return linegray;

}

 

效果如下

安卓支付宝红包密码的图片的处理实践_图文

4.      把上面步骤处理好的图片进行二值化处理,代码如下

 

    // 该函数实现对图像进行二值化处理

    public Bitmap gray2Binary(Bitmap graymap) {

        //得到图形的宽度和长度

        int width = graymap.getWidth();

        int height = graymap.getHeight();

        //创建二值化图像

        Bitmap binarymap = null;

        binarymap =graymap.copy(Bitmap.Config.ARGB_8888, true);

        //依次循环,对图像的像素进行处理

        for (int i = 0; i < width; i++) {

            for (int j = 0; j < height; j++){

                //得到当前像素的值

                int col = binarymap.getPixel(i,j);

                //得到alpha通道的值

                int alpha = col &0xFF000000;

                //得到图像的像素RGB的值

                int red = (col & 0x00FF0000) >>16;

                int green = (col &0x0000FF00) >> 8;

                int blue = (col &0x000000FF);

                // 用公式X = 0.3×R+0.59×G+0.11×B计算出X代替原来的RGB

                int gray = (int) ((float) red *0.3 + (float) green * 0.59 + (float) blue * 0.11);

                //对图像进行二值化处理

                if (gray <= 246) {

                    gray = 0;

                } else {

                    gray = 255;

                }

                // 新的ARGB

                int newColor = alpha | (gray<< 16) | (gray << 8) | gray;

                //设置新图像的当前像素值

                binarymap.setPixel(i, j,newColor);

            }

        }

        return binarymap;

}

效果如下:

 安卓支付宝红包密码的图片的处理实践_图文

哈哈,看到了吧,这样清楚,这样明显的支付宝口令密码,使用Tesseract-OCR是不是更容易,更简单,更准确!因为这个源码已经在上面贴上了,如果还有亲,需要源码的话,可以留言,我根据大家的意见上传demo!


                                                                                 安卓支付宝红包密码的图片的处理实践_图文