1、创建 Project
选 Empty Activity,其它信息自己填。
2、配置
一、在 app 的 build.gradle 中添加依赖
implementation 'com.rmtheis:tess-two:8.0.0'
二、在 AndroidManifest.xml 中添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYstemS" />
3、下载 tesseract 的字库
git 地址,这里只下两个,分别为简体中文的和英文的:chi_sim.traineddata 和 eng.traineddata。
在 app/src/main 下创建 assets 文件夹,将下载好的两个字库拷进去。
4、测试
准备好一张测试图片,这里为 nine.png:
。把这张图拷到 res/drawable 文件夹中。
以下是 MainActivity.java 的源码,注释详尽,可直接运行。
package com.example.imgpstrtest;
import android.Manifest;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.googlecode.tesseract.android.TessBaseAPI;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MainActivity extends AppCompatActivity {
/* mDataPath 是字库在手机上的存储位置 */
private String mDataPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tessdata/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getStorageAccesspermission(); // 获取权限
File parentfile = new File(mDataPath);
if (!parentfile.exists()){ // 确保路径存在
parentfile.mkdir();
}
copyFiles(); // 复制字库到手机
String lang = "chi_sim+eng"; // 使用简体中文 + 英文检测
TessBaseAPI mTess = new TessBaseAPI();
mTess.init(Environment.getExternalStorageDirectory().getAbsolutePath(), lang); // 初始化,第一个参数为 mDataPath 的父目录
Long starttime = System.currentTimeMillis(); // 检测开始时间
String OCRresult = null;
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.nine); // 获取测试图片
mTess.setimage(bitmap);
OCRresult = mTess.getUTF8Text(); // 拿到字符串结果
Long endtime = System.currentTimeMillis(); // 检测结束时间
Log.e("test", OCRresult);
Log.e("test", (endtime - starttime) + " ms");
}
private void copyFiles() {
String[] datafilepaths = new String[]{mDataPath + "/chi_sim.traineddata", mDataPath + "/eng.traineddata"}; // 拷两个字库过去
for (String datafilepath : datafilepaths) {
copyFile(datafilepath);
}
}
private void copyFile(String datafilepath) {
try {
String filepath = datafilepath;
String[] filesegment = filepath.split(File.separator);
String filename = filesegment[(filesegment.length - 1)]; // 获取字库文件名
AssetManager assetManager = getAssets();
InputStream instream = assetManager.open(filename); // 打开字库文件
OutputStream outstream = new FileOutputStream(filepath);
byte[] buffer = new byte[1024];
int read;
while ((read = instream.read(buffer)) != -1) {
outstream.write(buffer, 0, read);
}
outstream.flush();
outstream.close();
instream.close();
File file = new File(filepath);
if (!file.exists()) {
throw new FileNotFoundException();
}
} catch (FileNotFoundException e) {
e.printstacktrace();
} catch (IOException e) {
e.printstacktrace();
}
}
private void getStorageAccesspermission() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// 没有获得授权,申请授权
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(MainActivity.this, "请先授权!", Toast.LENGTH_LONG).show();
} else {
// 不需要解释为何需要该权限,直接请求授权
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
}
}
5、参考
https://blog.csdn.net/qq_33440246/article/details/78654871
https://blog.csdn.net/danfengw/article/details/79231201
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。