Android 如何使用文本识别器拍摄图片并读取其文本
所以我有一个按钮来拍摄包含文本的照片:Android 如何使用文本识别器拍摄图片并读取其文本,android,bitmap,decode,Android,Bitmap,Decode,所以我有一个按钮来拍摄包含文本的照片: takePic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent,100);
takePic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,100);
}
});
然后我从onActivityResult中获取图像:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 100) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
}
}
现在的问题是,当我将此位图传递给文本识别器检测器时,我没有得到任何结果。:
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
textRecognizer = new TextRecognizer.Builder(this).build();
SparseArray<TextBlock> item = textRecognizer.detect(frame);
我很乐意使用文本识别器
但我不知道如何处理相机拍摄的图像
编辑:
完整示例:
public class MainActivity extends AppCompatActivity {
private TextRecognizer textRecognizer;
private ImageView imageView;
private TextView Result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
Result = findViewById(R.id.tvResult);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.image);
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
textRecognizer = new TextRecognizer.Builder(this).build();
SparseArray<TextBlock> item = textRecognizer.detect(frame);
StringBuilder stringBuilder = new StringBuilder();
for (int i=0; i<item.size(); i++){
stringBuilder.append(item.valueAt(i).getValue());
}
Result.setText(stringBuilder.toString());
}
}
public类MainActivity扩展了AppCompatActivity{
专用文本识别器文本识别器;
私人影像视图;
私有文本视图结果;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=findViewById(R.id.imageView);
结果=findViewById(R.id.tvResult);
位图Bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.image);
Frame Frame=new Frame.Builder().setbit映射(位图).build();
textRecognizer=新建textRecognizer.Builder(this.build();
SparseArray项=文本识别器。检测(帧);
StringBuilder StringBuilder=新的StringBuilder();
对于(int i=0;i来说,最好为摄影机提供一个文件,以便为您保存该文件
根据:
首先,您可以像这样将位图转换为字节数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
byte[] byteArray = outputStream.toByteArray();
之后,可以使用BitmapFactory的decodeByteArray()函数和选项
BitmapFactory.decodeByteArray(byteArray , 0 ,byteArray.length,*option)
*选项是位图工厂选项这是使用InputStream
和BitmapFactory
从拍摄图像中获取位图
的最简单方法之一
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
InputStream stream;
if (requestCode == 100 && resultCode == Activity.RESULT_OK) {
try {
stream = getContentResolver().openInputStream(data.getData());
Bitmap bitmap = BitmapFactory.decodeStream(stream);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我是一个初学者,但我会努力理解这一点,我希望你知道我想做什么你传递一个文件(一个URI)对于相机,当用户拍照时,相机活动负责将图像保存在文件中。现在在onActivityResult
中,您读取字节,并将其转换为位图。这是解决我问题的最佳答案,谢谢!没问题!很高兴您得到了它。如果您能帮助我创建全屏su,那就太好了rfaceView当我使用TextRecognitizer请求中的位图时,它返回null现在我想使用BitmapFactory解码此图像
?“此图像”是什么意思?您已经有一个位图。没有其他内容。无论您让BitmapFactory解码什么,都会得到一个位图。我没有使用适当的词语来解释明确我的观点,因此我举了一个与drawable中的图像完美匹配的示例。您的示例没有解释您想要或需要什么。您应该开始编写更好的帖子和问题。您可以在Frame Frame=new Frame.Builder().setBitmap(bitmap.build()中使用从相机获得的位图
也是。这样做有什么问题?看起来很简单,但是当我尝试使用带有文本识别器的位图时仍然会出现空值。这很奇怪,因为这对我来说很有效(没有文本识别器
)。它可能是其他空的东西而不是位图
?最好你能显示你的代码在哪里得到位图
以及在哪里/如何使用它。我知道这很混乱,我将用完整的例子更新我的问题,向你展示我如何使用TextRec。如果图像在可绘制文件夹中,它会非常有效。@LovingAndroid在这些行中的哪一行上出现了空指针异常?不是您的代码,只是TextRec检测器不读取任何内容,并且在我将位图传递给它时返回空。
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
byte[] byteArray = outputStream.toByteArray();
BitmapFactory.decodeByteArray(byteArray , 0 ,byteArray.length,*option)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
InputStream stream;
if (requestCode == 100 && resultCode == Activity.RESULT_OK) {
try {
stream = getContentResolver().openInputStream(data.getData());
Bitmap bitmap = BitmapFactory.decodeStream(stream);
} catch (Exception e) {
e.printStackTrace();
}
}
}