我用Flutter手写了一款商业级文档扫描App,全程本地处理、数据不出设备(附完整源码)
写在前面:本文分享一款全本地文档扫描App的完整技术方案与源码。从边缘检测、曲面展平到离线OCR、PDF加密,全部用纯Dart算法实现,不调用任何云端API。文章末尾附完整工程源码下载(分三部分)。
一、为什么你需要一款"不联网"的扫描App?
先问三个直击灵魂的问题:
- 你手机里装的扫描App,拍照后图片到底去了哪里?
- 身份证、银行卡、合同……这些最敏感的资料,有没有上传到某台云服务器?
- 免费版的水印、付费版的订阅、会员才能用的高清导出,你受够了没有?
市面上99%的文档扫描App走的都是同一条路线:
拍照 → 上传云端 → 服务器做边缘检测/透视矫正/OCR → 结果回传手机 ↑ 你的敏感数据在这里裸奔这条路开发简单、算力充足,但代价是用户隐私。而我开发的这款安心扫描,走的是一条截然相反的路:
拍照 → 全部本地处理 → 结果直接存手机 ↑ 零隐私风险,零联网依赖🔒核心承诺:正式安装包不申请 INTERNET 权限。从系统层面杜绝数据外泄。无账号、无云同步、无统计埋点。
二、六大功能,覆盖日常所有扫描场景
| 功能 | 一句话说明 | 核心算法 |
|---|---|---|
| 📄文档扫描 | 拍照/相册导入→自动裁边→透视矫正→曲面展平→滤镜→导出PDF | 五级级联边缘检测 + 角点精化 + RANSAC曲面展平 |
| 🪪证件复印 | 身份证正反面拍一张,自动排版到A4,可加防滥用水印 | 边缘检测 + A4模板合成 |
| 📷证件照 | 拍照→自动抠像→换底色(白/蓝/红/黑)→标准尺寸裁剪 | YCbCr肤色保护 + 自适应洪水填充 |
| 🔤文字提取 | 离线OCR中英文,可复制存TXT | Tesseract本地引擎 + 专业预处理管线 |
| 🗜️图片压缩 | 目标KB一键达标,报名表/网传材料刚需 | 二分搜索 + 维度递降 |
| 💧图片水印 | 斜向平铺中文水印,防资料二次滥用 | 预渲染图块 + 主线程同步合成 |
三、技术选型:为什么是纯Dart,不是OpenCV?
很多人第一反应:图像处理为什么不用OpenCV?
| 维度 | OpenCV | 纯Dart(image包) |
|---|---|---|
| 包体积 | +30MB | 0 |
| 跨平台编译 | 需配CMake/NDK,Android/iOS各一遍 | 零配置 |
| 调试 | 需C++环境 | Dart断点直达 |
| 性能 | 更快 | 文档扫描场景完全够用 |
文档扫描的核心运算(边缘检测、透视变换、二值化)在手机端4ms即可完成,纯Dart的性能绰绰有余。省下的30MB包体积和跨平台编译痛苦,才是更大的收益。
核心依赖:
dependencies:flutter:sdk:flutterimage:4.1.7# 纯Dart图像处理pdf:3.11.0# PDF生成 + RC4-128加密printing:5.12.0# 本地打印image_picker:1.1.2# 相册多选provider:6.1.2# 状态管理flutter_tesseract_ocr:0.4.31# 本地OCRcrypto:^3.0.3# MD5摘要(PDF加密用)四、四层架构:职责分明,依赖单向
┌─────────────────────────────────────────┐ │ UI层 (Screens + Widgets) │ │ home / camera / crop / pages / export │ │ corner_editor / brush_canvas... │ ├─────────────────────────────────────────┤ │ 状态层 (Provider) │ │ ScanProvider + RecentsProvider │ │ linkRecents() 双向联动 │ ├─────────────────────────────────────────┤ │ 服务层 (Services) │ │ storage / pdf_export / ocr / watermark │ │ compress / id_copy / portrait... │ ├─────────────────────────────────────────┤ │ 算法层 (Processing) │ │ edge_detection / dewarp / perspective │ │ filters / spot_removal / id_composer │ └─────────────────────────────────────────┘每一层只与相邻层通信:UI不直接调算法,算法不关心UI状态。这种隔离让算法可以独立测试,UI可以灵活替换。
五、核心算法一:五级级联边缘检测,4ms搞定80%场景
单一Otsu二值化在低对比度场景会彻底失败。安心扫描用五级级联掩码逐级兜底:
/// 五级检测掩码依次尝试,任一成功即返回Uint8List?_detectLevel(Uint8Listgray,int w,int h,int level){switch(level){case0:return_otsuLight(gray,w,h);// Otsu亮背景case1:return_otsuDark(gray,w,h);// Otsu暗背景case2:return_gradientFloodFromMag(mag,w,h,thr:30);// 梯度洪水填充case3:return_morphGradient(gray,w,h);// 形态学梯度case4:return_textureAnalysis(gray,w,h);// 纹理分析兜底}}配合级联早退策略:得分超过阈值(2.8)立即返回,不再执行后续级别。实测:
| 模式 | 分辨率 | 耗时 | 说明 |
|---|---|---|---|
| 实时 | 250px | 4ms | 五级级联 + 早退,覆盖80%场景 |
| 精细 | 500px | ~30ms | 五级全开 + stdMap,无早退 |
六、核心算法二:曲面展平——RANSAC + 位移映射
书本、票据弯曲导致的文字扭曲,用RANSAC拟合文本行抛物线曲率,再通过位移映射矫正:
/// 文本行曲率拟合 + 位移映射/// 曲率上限 8%,防止字形过度拉伸/// 水平校正已禁用(数学证明 sx=x 不引起失真)| 步骤 | 算法 | 作用 |
|---|---|---|
| 文本行检测 | 峰值检测(minPeakGap = dh/60) | 定位每行 |
| 曲率拟合 | RANSAC二次抛物线 | 找出弯曲趋势 |
| 位移映射 | 自然三次样条 + 三次Hermite插值 | 平滑矫正 |
| 重采样 | Catmull-Rom双三次 | 文字边缘锐利 |
七、核心算法三:离线OCR预处理管线
Tesseract原版直接用效果一般,关键在预处理:
原图 → 自动裁切 → 放大 → 投影轮廓纠偏 → Sauvola二值化 → PSM=6识别(预处理图+原图各一次,取较长结果)八、性能实测数据
| 指标 | 实测值 |
|---|---|
| Release APK体积 | 99.9 MB |
| Debug APK体积 | 223.9 MB |
| 边缘检测(实时) | 4ms@250px |
| 水印预览(1200px) | <50ms |
| 水印导出(3200px) | ~1s |
| 图标Tree-shaking | 99.3%(1.6MB→12KB) |
九、竞品对比:凭什么选择它?
| 维度 | 安心扫描 | CamScanner | 白描 |
|---|---|---|---|
| 🔒 数据隐私 | 全程本地,不出设备 | 云端OCR,需上传 | 云端OCR,需上传 |
| 📡 网络权限 | 正式包不申请INTERNET | 需要 | 需要 |
| 📄 曲面展平 | RANSAC+Catmull-Rom | 闭源 | 无/基础 |
| 🔤 OCR | Tesseract离线内置 | 云端付费 | 云端 |
| 🔐 PDF加密 | RC4-128本地 | 付费 | 无 |
| 💧 水印 | 本地无广告水印 | 免费版强制水印 | 无 |
| 🪪 证件复印A4 | 正反面自动排版 | 支持 | 不支持 |
| 💰 收费 | 免费 | 订阅 | 买断+内购 |
十、完整工程源码下载
本项目完整源码已上传CSDN,因体积限制分为三个部分,下载后请按说明合并:
📦 第一部分:核心算法库 + 数学工具
下载地址:https://download.csdn.net/download/u010972645/93684889
包含:
lib/core/— 数学基础库(image_math.dart:形态学/Otsu/凸包/softGain)lib/services/processing/— 五大核心算法edge_detection.dart— 五级级联边缘检测dewarp.dart— 曲面展平perspective.dart— 透视矫正filters.dart— 滤镜 + 墨迹消除spot_removal.dart— 污点修复id_composer.dart— 证件A4合成scan_pipeline.dart— 统一处理管线
💡 这部分是整个项目的算法基石,单看这部分就能理解文档扫描的核心实现。
📦 第二部分:业务服务层 + 状态管理 + 数据模型
下载地址:https://download.csdn.net/download/u010972645/93684899
包含:
lib/services/— 业务服务pdf_export_service.dart+pdf_encryption.dart(RC4-128加密)ocr_service.dart、watermark_service.dart、compress_service.dartportrait_service.dart(人像抠图)、id_copy_service.dartstorage_service.dart、export_flow.dart
lib/providers/— ScanProvider + RecentsProvider 双Provider联动lib/models/— 可序列化数据模型scripts/— OCR语言包下载脚本
📦 第三部分:UI界面层 + 平台工程 + 完整工程配置
下载地址:https://download.csdn.net/download/u010972645/93684908
包含:
lib/screens/— 全部页面(首页/相机/裁边/编辑/多页/证件/导出)lib/widgets/— 自定义组件(四角编辑器/涂抹画笔/证件引导框)android/+ios/— 平台工程(含隐私配置、tessdata资源)pubspec.yaml、README.md、完整目录结构
十一、如何合并三部分源码
# 1. 下载三个压缩包到同一目录# 2. 解压第一部分到项目根目录# 3. 解压第二部分到同一根目录(覆盖合并)# 4. 解压第三部分到同一根目录(覆盖合并)# 5. 安装依赖flutter pub get--offline# 6. 运行flutter run# 7. 打包(确认无INTERNET权限)flutter build apk--release⚠️环境要求:Flutter 3.44.8(stable channel)+ JDK 17 + Android SDK 36
十二、写在最后
这款App我从0到1开发了数月,每一行算法代码都经过真实场景打磨。无论你是:
- 🎓计算机视觉学习者— 想了解纯Dart实现边缘检测、曲面展平的工业级方案
- 💻Flutter开发者— 想借鉴四层架构、双Provider联动、Isolate异步的实战经验
- 📱需要一款放心扫描App的用户— 不想再把身份证上传到云端
这套完整源码都值得你下载研究。全部本地处理、数据不出设备、永久免费。
🔥立即下载:第一部分(核心算法) | 第二部分(服务层+状态管理) | 第三部分(UI+平台工程)
如果觉得有帮助,欢迎点赞、收藏、关注,后续会更新16篇系列技术文章,逐篇拆解每个核心算法的实现细节。