上一篇
安卓做图片识别文字简单代码
- 行业动态
- 2025-04-24
- 9
“
java,// 引入ML Kit依赖,implementation 'com.google.mlkit:text-recognition:17.0.3',// 核心代码示例,InputImage image = InputImage.fromBitmap(bitmap, 0);,TextRecognizer recognizer = TextRecognition.getClient();,recognizer.process(image).addOnSuccessListener(text -> { / 处理结果 / });,
“
环境准备
- 开发工具:Android Studio(支持Gradle构建)
- 依赖库:使用Google ML Kit的文本识别功能(无需训练模型)
- 权限配置:读取外部存储权限
依赖配置
在 app/build.gradle
中添加ML Kit依赖:
dependencies { implementation 'com.google.mlkit:text-recognition:17.0.4' }
同步Gradle后即可使用。
布局设计 (activity_main.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="16dp"> <Button android:id="@+id/btn_select_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择图片" /> <ImageView android:id="@+id/iv_selected_image" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="fitCenter" android:visibility="gone" /> <TextView android:id="@+id/tv_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:textColor="#000" android:paddingTop="16dp" /> </LinearLayout>
权限配置 (AndroidManifest.xml)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
注意:Android 11及以上需动态申请权限。
核心代码实现 (MainActivity.java)
import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.google.mlkit.vision.common.ModelDownloadConditions; import com.google.mlkit.vision.text.TextRecognition; import com.google.mlkit.vision.text.TextRecognizer; import com.google.mlkit.vision.text.latin.TextRecognizerOptions; import java.io.IOException; public class MainActivity extends AppCompatActivity { private static final int IMAGE_PICK_CODE = 100; private ImageView ivSelectedImage; private TextView tvResult; private TextRecognizer textRecognizer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化视图 ivSelectedImage = findViewById(R.id.iv_selected_image); tvResult = findViewById(R.id.tv_result); Button btnSelectImage = findViewById(R.id.btn_select_image); // 初始化OCR引擎(支持多语言可替换LanguageIdentifier) textRecognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS); // 检查存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100); } // 绑定事件 btnSelectImage.setOnClickListener(v -> openImagePicker()); } // 打开系统相册选择图片 private void openImagePicker() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, IMAGE_PICK_CODE); } // 处理图片选择结果 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == IMAGE_PICK_CODE && resultCode == RESULT_OK && data != null) { Uri imageUri = data.getData(); try { // 加载图片并显示 Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); ivSelectedImage.setImageBitmap(bitmap); ivSelectedImage.setVisibility(View.VISIBLE); // 执行文字识别 recognizeTextFromImage(bitmap); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "图片加载失败", Toast.LENGTH_SHORT).show(); } } } // 使用ML Kit进行文字识别 private void recognizeTextFromImage(Bitmap bitmap) { textRecognizer.processImage(bitmap) .addOnSuccessListener(visionText -> { // 拼接识别结果 StringBuilder result = new StringBuilder(); for (com.google.mlkit.vision.text.Text.Element element : visionText.getTextBlocks()) { result.append(element.getText()).append(" "); } tvResult.setText(result.toString()); }) .addOnFailureListener(e -> { Toast.makeText(this, "识别失败: " + e.getMessage(), Toast.LENGTH_LONG).show(); }); } }
运行效果说明
- 点击「选择图片」按钮,从相册中选择包含文字的图片。
- 图片显示在
ImageView
中,下方TextView
展示识别结果。 - 支持中英文混合、多行文本识别。
注意事项
问题 | 解决方案 |
---|---|
首次使用ML Kit需下载模型 | 自动完成,需保证网络畅通 |
Android 11+存储权限限制 | 使用 MediaStore 或 Storage Access Framework |
大分辨率图片可能导致内存溢出 | 对图片进行压缩处理 |
复杂背景或模糊文字识别率低 | 优化图片质量或预处理(如灰度化) |
相关问题与解答
问题1:如何提高文字识别准确率?
解答:
- 确保图片清晰,文字无遮挡或扭曲。
- 对图片进行预处理(如灰度化、二值化)。
- 使用
TextRecognizerOptions
配置语言模型(如指定中文):TextRecognizerOptions options = new TextRecognizerOptions.Builder() .setLanguagePreference(TextRecognizerOptions.SUPPORTED_LANGUAGES[1]) // 中文为索引1 .build(); textRecognizer = TextRecognition.getClient(options);
问题2:如何实时拍摄照片并识别文字?
解答:
- 使用
CameraX
或Intent
调用系统相机。 - 获取拍照后的
Bitmap
直接传入recognizeTextFromImage()
。 - 关键代码修改:
// 启动相机Intent Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);