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();
        }
    }
}