有一天,群里面有一个群员发来一个图片,图片上面有支付宝红包的密码,于是我就想能不能做成类似于抢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!