Flutter光学字符识别插件tesseract的使用

Flutter光学字符识别插件tesseract的使用

该插件基于 Tesseract OCR。此插件使用了 Tesseract4AndroidSwiftyTesseract

示例代码

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:tesseract/tesseract.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Tesseract Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Tesseract Demo'),
        centerTitle: true,
      ),
      body: SafeArea(
        child: Center(
          child: SingleChildScrollView(
            child: Padding(
              padding: EdgeInsets.symmetric(horizontal: 16),
              child: Column(
                children: [
                  ElevatedButton(
                      onPressed: () {
                        initTesseract();
                      },
                      child: Text('初始化 Tesseract')),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }

  initTesseract() async {
    // 初始化 Tesseract 并设置语言为英语
    var result = await Tesseract.initTesseract(language: 'eng');
    print(result);
  }
}

// 自定义卡片组件
class CustomCard extends StatelessWidget {
  final String label;
  final Widget viewPage;
  final FeatureStatus featureStatus;

  const CustomCard({
    required this.label,
    required this.viewPage,
    required this.featureStatus,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Card(
      elevation: 5,
      margin: EdgeInsets.only(bottom: 10),
      child: ListTile(
        tileColor: Theme.of(context).primaryColor,
        title: Text(
          label,
          style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
        ),
        onTap: () {
          if (Platform.isIOS &&
              (featureStatus.index == 0 || featureStatus.index == 1)) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: const Text('此功能尚未在 iOS 上实现'),
              ),
            );
          } else if (Platform.isAndroid &&
              (featureStatus.index == 0 || featureStatus.index == 2)) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: const Text('此功能尚未在 Android 上实现'),
              ),
            );
          } else if (!Platform.isAndroid && !Platform.isIOS) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: const Text('平台不支持'),
              ),
            );
          } else {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => viewPage),
            );
          }
        },
      ),
    );
  }
}

// 功能状态枚举
enum FeatureStatus { None, Android, IOS, Both }

完整示例Demo

以下是完整的示例代码,展示了如何使用 tesseract 插件进行光学字符识别(OCR):

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:tesseract/tesseract.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Tesseract Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Tesseract Demo'),
        centerTitle: true,
      ),
      body: SafeArea(
        child: Center(
          child: SingleChildScrollView(
            child: Padding(
              padding: EdgeInsets.symmetric(horizontal: 16),
              child: Column(
                children: [
                  ElevatedButton(
                    onPressed: () {
                      initTesseract();
                    },
                    child: Text('初始化 Tesseract'),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }

  initTesseract() async {
    // 初始化 Tesseract 并设置语言为英语
    var result = await Tesseract.initTesseract(language: 'eng');
    print(result);
  }
}

更多关于Flutter光学字符识别插件tesseract的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter光学字符识别插件tesseract的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用tesseract_ocr插件来进行光学字符识别(OCR)的代码示例。这个插件允许你从图像中提取文本。

首先,你需要在pubspec.yaml文件中添加tesseract_ocr依赖:

dependencies:
  flutter:
    sdk: flutter
  tesseract_ocr: ^0.3.3  # 请确保使用最新版本

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter项目中编写代码来使用tesseract_ocr插件。以下是一个完整的示例,包括从设备图库中选择图像并进行OCR识别的功能。

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:tesseract_ocr/tesseract_ocr.dart';

注意:我们还需要image_picker包来从设备图库中选择图像。因此,你还需要在pubspec.yaml中添加image_picker依赖。

dependencies:
  image_picker: ^0.8.4+4  # 请确保使用最新版本
  1. 创建Flutter应用
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: OcrScreen(),
    );
  }
}

class OcrScreen extends StatefulWidget {
  @override
  _OcrScreenState createState() => _OcrScreenState();
}

class _OcrScreenState extends State<OcrScreen> {
  final ImagePicker _picker = ImagePicker();
  File? _imageFile;
  String _ocrResult = '';

  Future<void> _pickImage(ImageSource source) async {
    final pickedFile = await _picker.pickImage(source: source);

    if (pickedFile != null) {
      setState(() {
        _imageFile = File(pickedFile.path);
      });

      _performOCR();
    }
  }

  Future<void> _performOCR() async {
    if (_imageFile == null) return;

    TesseractOcr tesseractOcr = TesseractOcr();

    try {
      String result = await tesseractOcr.recognizeText(_imageFile!.path, lang: 'eng');
      setState(() {
        _ocrResult = result;
      });
    } catch (e) {
      print("OCR failed: $e");
      setState(() {
        _ocrResult = 'OCR failed';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter OCR Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            _imageFile == null
                ? Text('No image selected.')
                : Image.file(_imageFile!),
            SizedBox(height: 20),
            Text('OCR Result:', style: TextStyle(fontWeight: FontWeight.bold)),
            Text(_ocrResult, style: TextStyle(fontSize: 16)),
            SizedBox(height: 20),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                ElevatedButton(
                  onPressed: () => _pickImage(ImageSource.gallery),
                  child: Text('Pick from Gallery'),
                ),
                ElevatedButton(
                  onPressed: () => _pickImage(ImageSource.camera),
                  child: Text('Capture from Camera'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  • 我们使用ImagePicker来选择图像。
  • 选择图像后,我们调用_performOCR函数来执行OCR识别。
  • OCR识别的结果存储在_ocrResult字符串中,并在UI中显示。

请确保在iOS和Android项目中配置必要的权限,例如访问相机和存储的权限。

希望这个示例对你有帮助!如果你有任何问题或需要进一步的帮助,请随时告诉我。

回到顶部