☰
2. 一款用Flutter实现的商业级文档扫描App,全程本地处理、数据不出设备(附完整源码)
2026/10/15 9:20:08 网站建设 项目流程

我用Flutter手写了一款商业级文档扫描App,全程本地处理、数据不出设备(附完整源码)

写在前面:本文分享一款全本地文档扫描App的完整技术方案与源码。从边缘检测、曲面展平到离线OCR、PDF加密,全部用纯Dart算法实现,不调用任何云端API。文章末尾附完整工程源码下载(分三部分)。


一、为什么你需要一款"不联网"的扫描App?

先问三个直击灵魂的问题:

  • 你手机里装的扫描App,拍照后图片到底去了哪里?
  • 身份证、银行卡、合同……这些最敏感的资料,有没有上传到某台云服务器?
  • 免费版的水印、付费版的订阅、会员才能用的高清导出,你受够了没有?

市面上99%的文档扫描App走的都是同一条路线:

拍照 → 上传云端 → 服务器做边缘检测/透视矫正/OCR → 结果回传手机 ↑ 你的敏感数据在这里裸奔

这条路开发简单、算力充足,但代价是用户隐私。而我开发的这款安心扫描,走的是一条截然相反的路:

拍照 → 全部本地处理 → 结果直接存手机 ↑ 零隐私风险,零联网依赖

🔒核心承诺:正式安装包不申请 INTERNET 权限。从系统层面杜绝数据外泄。无账号、无云同步、无统计埋点。


二、六大功能,覆盖日常所有扫描场景

功能一句话说明核心算法
📄文档扫描拍照/相册导入→自动裁边→透视矫正→曲面展平→滤镜→导出PDF五级级联边缘检测 + 角点精化 + RANSAC曲面展平
🪪证件复印身份证正反面拍一张,自动排版到A4,可加防滥用水印边缘检测 + A4模板合成
📷证件照拍照→自动抠像→换底色(白/蓝/红/黑)→标准尺寸裁剪YCbCr肤色保护 + 自适应洪水填充
🔤文字提取离线OCR中英文,可复制存TXTTesseract本地引擎 + 专业预处理管线
🗜️图片压缩目标KB一键达标,报名表/网传材料刚需二分搜索 + 维度递降
💧图片水印斜向平铺中文水印,防资料二次滥用预渲染图块 + 主线程同步合成

三、技术选型:为什么是纯Dart,不是OpenCV?

很多人第一反应:图像处理为什么不用OpenCV?

维度OpenCV纯Dart(image包)
包体积+30MB0
跨平台编译需配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)立即返回,不再执行后续级别。实测:

模式分辨率耗时说明
实时250px4ms五级级联 + 早退,覆盖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-shaking99.3%(1.6MB→12KB)

九、竞品对比:凭什么选择它?

维度安心扫描CamScanner白描
🔒 数据隐私全程本地,不出设备云端OCR,需上传云端OCR,需上传
📡 网络权限正式包不申请INTERNET需要需要
📄 曲面展平RANSAC+Catmull-Rom闭源无/基础
🔤 OCRTesseract离线内置云端付费云端
🔐 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.dart
    • portrait_service.dart(人像抠图)、id_copy_service.dart
    • storage_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篇系列技术文章,逐篇拆解每个核心算法的实现细节。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询