如何在Flutter中检测扫描文档的方向?
在Flutter中检测扫描文档的方向方案
方案一:利用Google ML Kit文本识别
ML Kit的文本识别能力可以直接检测文本的旋转角度,以此判断文档方向(通常为0°、90°、180°、270°)。
- 添加依赖到
pubspec.yaml:
dependencies: google_mlkit_text_recognition: ^0.12.0 image_picker: ^1.0.4 # 用于获取扫描文档图片
- 核心代码实现:
import 'package:google_mlkit_text_recognition/google_mlkit_text_recognition.dart'; import 'package:image_picker/image_picker.dart'; import 'dart:math' as math; Future<int?> detectDocumentOrientation() async { final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery); if (pickedFile == null) return null; final inputImage = InputImage.fromFilePath(pickedFile.path); final textRecognizer = TextRecognizer(script: TextRecognitionScript.latin); final RecognizedText recognizedText = await textRecognizer.processImage(inputImage); // 取第一个文本块的角度作为文档方向(多数场景下有效) if (recognizedText.blocks.isNotEmpty) { final angle = recognizedText.blocks.first.angle; // 将弧度转换为近似的角度值(0/90/180/270) final degrees = (angle * 180 / math.pi).round(); // 处理负数角度,转为0-360范围内 final normalizedDegrees = (degrees + 360) % 360; return normalizedDegrees; } await textRecognizer.close(); return null; }
方案二:集成Tesseract OCR
Tesseract是成熟的OCR引擎,内置文本方向检测能力,可通过Flutter第三方包快速集成。
- 添加依赖:
dependencies: tesseract_ocr: ^0.6.4 image_picker: ^1.0.4
- 核心代码:
import 'package:tesseract_ocr/tesseract_ocr.dart'; import 'package:image_picker/image_picker.dart'; Future<int?> getDocumentOrientation() async { final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery); if (pickedFile == null) return null; // 初始化Tesseract,指定语言包(需提前下载对应语言的traineddata) await TesseractOcr.init('eng'); // 获取方向信息,Tesseract会返回0/90/180/270中的一个 final orientation = await TesseractOcr.getOrientation(pickedFile.path); await TesseractOcr.dispose(); return orientation; }
方案三:调用原生平台API(自定义实现)
如果需要更高的定制性,可以直接在iOS/Android原生层实现方向检测,再通过MethodChannel与Flutter通信:
- Android:使用Google ML Kit或Tesseract原生库,检测文本方向后返回给Flutter
- iOS:利用Vision框架的
VNDetectTextRectanglesRequest,获取文本的边界框角度,计算文档方向
注意事项
- 扫描文档的文本方向通常为0°、90°、180°、270°,无需处理任意角度
- 确保图片质量清晰,避免模糊、倾斜过度的文档导致检测失败
- 使用ML Kit或Tesseract时,需注意权限申请(如存储权限、相机权限)
内容的提问来源于stack exchange,提问作者Lokesh
相关产品推荐
相关产品推荐

