android屏幕取词的简单实现(二)(使用OCR技术)

原文地址::http://www.tuicool.com/articles/feeEZf


相关文章

1、屏幕取词 被取对象为QT程序 ----http://bbs.csdn.net/topics/390442683

2、屏幕取词技术实现原理----http://blog.csdn.net/attilax/article/details/52962258


很久之前就应该完成的东西 
直到今天才抽出时间来弄 
接着上一篇http://blog.csdn.net/libaier_gc/article/details/7295242 
上次这篇文章被无情的喷了,感觉还是有道理 
毕竟写的效率太低了 
这此换另外一种方法实现屏幕取词 
即使用OCR技术 
呵呵,当然这只是个demo程序 
与其说是“屏幕取词”,还不如说是“截图翻译” 
但屏幕取词的思想大概就是这样吧~(额,估计有该有人喷了。。) 
废话真多!直接开始说程序了~


程序运行情况截图 


主要运行过程 
点击“截张小图~”从本地一张图片中截取自己想翻译的特定部分 
点击“ocr一下”讲自己截出的图片进行OCR取词翻译

真正实现屏幕取词的时候,先截取现在的屏幕,然后自己选取指定部分进行翻译即可~ 
由于以后一年可能会长期从事屏幕取词的开发,诸多细节还需完善,所以今天只发demo程序

首先贴出完整代码

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:autoLink="web"
        android:gravity="center"
        android:text="www.libaier.net"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/getPic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="41dp"
        android:text="截张小图~" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/getPic"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="72dp" />

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:gravity="center"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/ocr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/imageView1"
        android:layout_marginTop="98dp"
        android:text="OCR一下~" />

</RelativeLayout>

可执行程序

package libaier.ocr;

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.googlecode.tesseract.android.TessBaseAPI;

public class OCRActivity extends Activity {

	private static int SELECT_PICTURE;// 返回标志位 filed

	private File tempFile;

	private Button getpicButton = null;
	private Button ocrButton = null;

	private ImageView imageView = null;

	private TextView textView = null;
	private Bitmap bitmap = null;

	// ** Called when the activity is first created. *//*
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.tempFile = new File("/sdcard/ocr.png");// 这句一定要在onCreate()里面调用

		setContentView(R.layout.main);
		getpicButton = (Button) findViewById(R.id.getPic);
		ocrButton = (Button) findViewById(R.id.ocr);

		textView = (TextView) findViewById(R.id.result);

		imageView = (ImageView) findViewById(R.id.imageView1);

		getpicButton.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
				intent.setType("image/*");
				intent.putExtra("crop", "true");// crop=true 有这句才能出来最后的裁剪页面.

				intent.putExtra("aspectX", 2);// 这两项为裁剪框的比例.
				intent.putExtra("aspectY", 1);// x:y=1:2

				intent.putExtra("output", Uri.fromFile(tempFile));
				intent.putExtra("outputFormat", "PNG");// 返回格式

				startActivityForResult(Intent.createChooser(intent, "选择图片"),
						SELECT_PICTURE);
			}
		});
	}

	// **
	// 裁剪完图片后系统调用的方法:onActivityResult
	// *
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK)
			if (requestCode == SELECT_PICTURE) {

				bitmap = BitmapFactory.decodeFile("/sdcard/ocr.png");
				Drawable drawable = new BitmapDrawable(bitmap);
				imageView.setBackgroundDrawable(drawable);
				// tesseract req. ARGB_8888
				bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

				ocrButton.setOnClickListener(new OnClickListener() {

					public void onClick(View v) {
						// TODO Auto-generated method stub
						TessBaseAPI baseApi = new TessBaseAPI();
						baseApi.init(android.os.Environment
								.getExternalStorageDirectory()
								.getAbsolutePath()
								+ "/ocr", "eng");
						baseApi.setImage(bitmap);
						// 根据Init的语言,获得ocr后的字符串
						String text = baseApi.getUTF8Text();
						// 释放bitmap
						baseApi.clear();

						// 如果连续ocr多张图片,这个end可以不调用,但每次ocr之后,必须调用clear来对bitmap进行释放
						// 释放native内存
						baseApi.end();
						textView.setText("识别结果为:\n"+text);
					}
				});

			}
	}
}
代码其实很简单

oncreate()中主要进行截图 
onActivityResult()进行OCR翻译 
这里使用了tesseract的 OCR库

要在自己的手机上运行此应用程序 
先要在SD卡上建立/ocr文件夹,将 这个文件 (tesseract的 OCR库)解压到这个文件夹里才能运行~

自己使用tesseract开发,还需在自己的android源码工程中添加/lib文件夹和.jar文件 
详情可参考 这篇文章 ~

最后是完整工程下载地址 http://download.csdn.net/detail/libaier_gc/4194247

相信大家应该能看懂吧~

这几天被Gallery3d搞的很乱

洗洗睡了~

愚人节快乐~

 

原创文章,转载请注明:  转载自 libaier

本文链接地址:   android屏幕取词的简单实现(使用OCR技术)



GetWord是一款专业的屏幕取词组件(控件),它可以帮助您在公司产品中快速便捷地集成屏幕取词功能,有效降低软件开发成本。 GetWord是世界上第一款也是目前唯一一款全面支持Windows和Adobe Acrobat/Acrobat Reader的专业屏幕取词引擎。GetWord支持单点取词、区域取词、选择取词等多种取词模式,支持Windows 2000/XP/Server2003/Vista/Server2008/Windows 7/Windows 8/Windows 10等各种主流操作系统,支持VB/VC/Delphi/C++ Builder/C#/.Net等各种常见开发环境。 目前,遍布世界各地的60多个国家和地区的众多客户都在使用GetWord。这些客户有:Apple(美国)、LEC(美国)、NetBrain(美国)、Autonomy(英国)、MJT Net(英国)、Linguatec(德国)、Issendis(法国)、Karolinska Insitutet(瑞典)、Caliber Multimedia(台湾)、MegaDict(泰国)、Matrix Development System(西班牙)、Future Electronics(新加坡)、支付宝(中国)、国泰君安(中国)、快鱼科技(中国)、爱科信(中国), 海词(中国)等等. 支持的操作系统: Windows 2000/Windows XP/Windows Server 2003/Windows Vista/Windows Server 2008/Windows 7/Windows 8/Windows 10 支持的软件开发环境: GetWord支持所有主流的软件开发环境,如Visual Studio, Visual Studio .Net, Delphi , C++ Builder, Dev-Cpp,Java等等。 主要功能特征: 1. 支持英文, 简体中文, 繁体中文, 俄语, 法语, 日语, 德语, 西班牙语, 阿拉伯语, 朝鲜语, 土耳其语, 瑞典语, 挪威语, 意大利语, 拉丁语, 葡萄牙语, 波兰语, 印度语, 泰国语, 越南语等所有常见语言编码格式. 2. 支持Unicode. 3. 支持语境信息提取和整句提取,不仅可取到光标所在处的词,还可以取到其前后的词,便于智能识别和分析. 4. 支持区域抓取,可以抓取到给定区域内的所有文字(一行或多行). 5. 支持Adobe Acrobat/Acrobat Reader的PDF屏幕取词(已集成Adobe商用数字证书,该证书Adobe售价2500美金). 6. 支持选择取词(亦称高亮取词,划词取词). 7. 支持命令行(Command Prompt)取词. 8. 支持各种标准Windows组件,如对话框、工具栏、菜单、编辑框、组合框、列表框、树型控件等. 9. 支持各种常见办公软件,如微软Office、Outlook Express等. 10. 支持各种常见浏览器,如IE、FireFox、Mozilla、MyIE、Netscape等. 11. 支持鼠标取词、热键取词等多种取词模式. 支持ActiveX、Raw Dll等多种调用接口. 12. 封装程度高,使用方便,向现有应用程序中添加屏幕取词支持一般只需要十几行语句即可.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值