之前我写过一篇Java日记——识别简单的验证码,虽然安卓用的也是java语言,但有些java的东西在安卓上就不行,比如那个awt的一个BufferImage。
所以我查了很久资料,终于把他翻译成安卓的啦。
主要将本地的trainimg放在asset里,BufferImage改为Bitmap
源码如下:(注释的话和java日记的差不多我就不写了,只是部分改变了而已)
package com.jkgeekjack.myocr; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.media.Image; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.ImageView; import android.widget.TextView; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.AbstractList; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends AppCompatActivity { private static Map<Bitmap, String> trainMap =new HashMap<Bitmap, String>(); private TextView tv; private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv= (TextView) findViewById(R.id.tv); iv= (ImageView) findViewById(R.id.iv); Bitmap code = null; try { InputStream inputStream = getResources().getAssets().open("code.png"); code = BitmapFactory.decodeStream(inputStream); //这里可以将bitmap换成自己获取的验证码,我这里用的是本地的 } catch (IOException e) { e.printStackTrace(); } iv.setImageBitmap(code); String text = getAllOcr(code); tv.setText(text); } private String getAllOcr(Bitmap code) { Bitmap aftercode =removeBackGround(code); List<Bitmap>listImg=split(aftercode); Map<Bitmap,String>map=loadTrainData(); String result = ""; for (Bitmap bi : listImg) { result += getSingleCharOcr(bi, map); } return result; } private String getSingleCharOcr(Bitmap img, Map<Bitmap, String> map) { String result = "#"; int width = img.getWidth(); int height =img.getHeight(); int min = width * height; for (Bitmap bi : map.keySet()) { int count = 0; if (Math.abs(bi.getWidth()-width) > 2) continue; int widthmin = width < bi.getWidth() ? width : bi.getWidth(); int heightmin = height < bi.getHeight() ? height : bi.getHeight(); Label1: for (int x = 0; x < widthmin; ++x) { for (int y = 0; y < heightmin; ++y) { if (isBlack(img.getPixel(x, y)) != isBlack(bi.getPixel(x, y))) { count++; if (count >= min) break Label1; } } } if (count < min) { min = count; result = map.get(bi); } } return result; } private List<Bitmap> split(Bitmap aftercode) { List<Bitmap> subImgs = new ArrayList<Bitmap>(); int width = aftercode.getWidth()/4; int height = aftercode.getHeight(); subImgs.add(Bitmap.createBitmap(aftercode,0,0,width,height)); subImgs.add(Bitmap.createBitmap(aftercode,width,0,width,height)); subImgs.add(Bitmap.createBitmap(aftercode,width*2,0,width,height)); subImgs.add(Bitmap.createBitmap(aftercode,width*3,0,width,height)); return subImgs; } private Map<Bitmap,String> loadTrainData() { try { String[] picsptah=getAssets().list("trainimg"); // Log.e("size",picsptah.length+""); InputStream inputStream; Bitmap bitmap; for (String picpath:picsptah){ inputStream=getResources().getAssets().open("trainimg/"+picpath); bitmap = BitmapFactory.decodeStream(inputStream); // piclist.add(bitmap); if (bitmap!=null){ trainMap.put(bitmap,picpath.charAt(0)+""); } // Log.e("pic",picpath); } } catch (IOException e) { e.printStackTrace(); } return trainMap; } private Bitmap removeBackGround(Bitmap code) { Bitmap cutcode=Bitmap.createBitmap(code,5,1,code.getWidth()-5,code.getHeight()-2); cutcode=Bitmap.createBitmap(cutcode,0,0,50,cutcode.getHeight()); int width=cutcode.getWidth(); int height=cutcode.getHeight(); for (int x=0;x<width;x++) for (int y=0;y<height;y++) { if(isBlue(cutcode.getPixel(x,y))==1){ cutcode.setPixel(x,y,Color.BLACK); }else { cutcode.setPixel(x,y,Color.WHITE); } } return cutcode; } private int isBlue(int pixel) { Log.e("Blue",Color.red(pixel)+Color.red(pixel)+Color.red(pixel)+""); if (Color.red(pixel)+Color.red(pixel)+Color.red(pixel)==0){ return 1; }else{ return 0; } } private int isBlack(int pixel) { if (Color.red(pixel)+Color.red(pixel)+Color.red(pixel)<100){ return 1; }else{ return 0; } } }
demo地址:https://github.com/jkgeekJack/SimpleOrc