Image Scanner 应用开发实战:用 Google Vision OCR 与正则从照片中提取电话、邮箱与网址(app-ideas 中级项目)
发布时间:2026/10/1 8:37:00 作者:尧图编辑部 阅读量:1,286
)
文档教程【免费下载链接】app-ideasA Collection of application ideas which can be used to improve your coding skills.项目地址https://gitcode.com/GitHub_Trending/ap/app-ideas点击查看免费下载导读Image Scanner是 app-ideas 仓库中一个定位于2-Intermediate中级的移动端实战项目目标是在 Android 与 iOS 上构建一款照片信息提取器用户拍摄或从相册上传一张图片后应用通过Google Cloud Vision OCR识别其中的文字再用**正则表达式Regex**从识别文本中筛出电话号码、电子邮件与网站链接最后以卡片列表的形式组织呈现并支持一键保存联系人与历史记录。阅读本文后你将掌握一条完整的图像 OCR → 文本清洗 → 正则结构化 → 移动端展示技术链路可直接照着实现一版可运行的双端应用并在此基础上扩展标签、跨设备同步等进阶能力。一、项目定位与技术栈拆解原文档 (Projects/2-Intermediate/Image-Scaner.md) 对项目的定义非常聚焦Create an android and ios app to find phone numbers, email and website links available in a photo and then organise it in the app.翻译过来即在移动端应用内从一张照片里找出电话号码、邮箱和网页链接并在应用内有序组织。这决定了该项目的三条核心技术主线图像输入链路拍照Camera或相册Gallery选图OCR 识别链路调用 Google Cloud Vision API 将图片中的文字转为可检索文本信息结构化链路用正则表达式对 OCR 文本做模式匹配区分出三类实体手机号、邮箱、网址再渲染为卡片。从仓库的层级划分看中级Tier-2意味着开发者应已具备 UI/UX 基础、熟练使用开发工具并能调用 API 服务见 README.md 中的 Tier 定义。本项目的难度恰好落在移动端 云 API 文本处理三者的交汇处比初级项目多了网络请求与异步处理又比高级项目少了后端与数据库的复杂度是一个练习调用第三方 OCR 服务的绝佳载体。二、需求拆解五条核心 User Story原文档给出了五条必须实现的核心用户故事它们是验收的底线User Story 1用户可以拍照也可以从相册上传照片——应用需要同时打通 Camera 与 Photo Library 两条取图渠道User Story 2图片上传后执行 OCR 处理——处理应在上传之后异步进行界面需有加载态User Story 3若图片中存在电话号码、邮箱或网页链接则以卡片cards形式列出并做好组织分类——这是结果展示层的核心要求User Story 4点击某条详情时提供保存为联系人save as contact的选项——需要把结构化实体映射到系统通讯录的写入接口User Story 5搜索结果的历史记录以列表视图展示——需要本地持久化存储每次扫描结果。从工程实现角度五条故事实际上划出了四个功能模块取图模块拍照/相册→ OCR 服务模块 → 实体解析与卡片渲染模块 → 历史记录与联系人导出模块。实现时建议按此顺序逐个交付先让单张图 → 三类实体 → 卡片的主链路跑通再补历史记录与联系人导出。三、OCR 选型与调用方式原文档在 Useful links and resources 中明确建议使用Google Cloud Vision 的 OCR 能力文档指向https://cloud.google.com/vision/docs/ocr。这是本项目最关键的技术决策值得展开说明3.1 为什么选择 Google Cloud VisionCloud Vision API 的DOCUMENT_TEXT_DETECTION文档文字检测与TEXT_DETECTION文字检测接口可以直接接收图片字节流返回按文本块block、段落paragraph、单词word分层组织的结果。对于名片、海报、截图、菜单这类典型照片场景其识别准确率与排版还原度较高且支持多种语言非常适合本项目。3.2 请求格式要点调用方式为标准的 REST 请求将图片以Base64 编码放入 JSON body{ requests: [ { image: { content: /9j/4AAQSkZJRgABAQAAAQABAAD... // 图片的 Base64 编码内容 }, features: [ { type: TEXT_DETECTION, maxResults: 10 } ] } ] }type取TEXT_DETECTION即可满足本项目需求若后续要做版式复原可改用DOCUMENT_TEXT_DETECTION响应中的responses[0].textAnnotations[0].description是整张图的完整识别文本直接交给下一步正则处理即可需要注意Google Vision 是付费 API按请求次数计费开发调试阶段务必留意配额与预算上传前建议在客户端做图片压缩与降采样既能减少网络流量也能降低单次识别的成本。3.3 移动端的调用安全建议Android 与 iOS 两端都不建议把 API Key 直接硬编码进 App 包内会被反编译窃取。更稳妥的做法是客户端将图片上传到自己的后端服务由后端调用 Vision API 后把识别文本返回给客户端。这也是本项目可以自然延伸出登录 跨设备同步见 Bonus 特性的架构基础。四、正则提取三类实体核心解析逻辑原文档给出了一句关键的实现指引Apply regex to identify the phone number, emails and website links on the text identified from the OCR.OCR 输出的是一整块连续文本其中电话号码、邮箱、网址混杂在一起正则表达式是把它们结构化分离的最直接工具。这一思路与仓库中另两个项目的定位相互印证Javascript-Validation-With-Regex 展示了用正则校验用户输入的完整范式RegExp-Helper-App 则强调正则的核心价值在于用一行模式匹配替代手写循环遍历这也正是本项目 OCR 后处理环节的核心思想。下面给出一组可直接用于本项目的中立示例正则以 JavaScript 语法为例跨平台通用// 1) 邮箱匹配常见的 namedomain.tld 形式 const EMAIL_RE /[\w.-][\w-](\.[\w-])/g; // 2) 网址匹配 http(s) 链接或裸域名形式不含末尾的标点符号 const URL_RE /(https?:\/\/)?(www\.)?[\w-](\.[\w-])(:\d)?(\/[^\s,。;]*)?/g; // 3) 电话号码匹配常见的国际/本地号码形态 // 86 138-0000-0000、010-12345678、(021) 1234 5678 等 const PHONE_RE /(\?\d{1,3}[-. ]?)?(\(?\d{2,4}\)?[-. ]?)?\d{3,4}[-. ]?\d{3,4}/g;使用时的标准流程是function extractEntities(ocrText) { return { emails: [...new Set(ocrText.match(EMAIL_RE) || [])], urls: [...new Set(ocrText.match(URL_RE) || [])], phones: [...new Set(ocrText.match(PHONE_RE) || [])], }; }4.1 实操中的三个坑OCR 噪声图片倾斜、字体花哨会引入多余字符如把o识别成0正则匹配前可先做基础的空白折叠与小写归一化去重同一实体可能被多个文本块重复识别用Set或等价去重逻辑去重边界净化OCR 常把句末标点粘连在网址尾部匹配后应裁剪尾部的. , ;等字符避免保存的链接 404。由于各国电话号码格式差异极大建议按目标用户地区裁剪手机号正则并预留配置项以便后续扩展。五、卡片展示、保存联系人、历史记录原文档对结果展示提出了cards properly organized卡片有序组织的明确要求三条用户体验细节需要认真落地按类型分组渲染同一张图识别出的三类实体建议在卡片上以色块或图标区分类型电话 / 邮箱 / 网址方便用户快速定位点按交互点击卡片弹出生操作菜单如拨打电话 / 发送邮件 / 打开链接其中电话与邮箱要提供保存为联系人选项——移动端可调用系统通讯录写入 API将号码与邮箱组装成联系人Contact对象后写入历史记录列表每次扫描完成后把原始图片缩略图、识别出的实体列表、扫描时间一起写入本地数据库如 iOS 的 Core Data / Android 的 Room 或 SQLite主界面用列表视图按时间倒序呈现点击可回看当时的结果。六、Bonus 扩展从单机走向多端同步原文档给出了三条可选的 Bonus 特性它们是项目进阶的方向也能显著提升作品的完整度标签体系允许用户为每条扫描结果添加自定义标签如名片会议在列表视图中以标签徽章展示标签搜索在历史列表顶部提供搜索框按标签过滤历史记录——这是对正则/字符串匹配能力的又一次练习也可以顺带练习模糊搜索登录与多设备同步接入账号体系把历史记录与标签同步到服务端。这一步需要把 3.3 节提到的后端服务真正落地存储 同步接口是从纯客户端应用向端云一体应用演进的关键一跃也是迈向仓库中Tier-3高级项目如涉及后端与数据库服务的自然跳板参见 README.md 的层级说明。七、落地建议与验收清单结合 Example Guide 中每个项目都应包含清晰目标、用户故事、Bonus 与资源的模板思路建议按如下顺序推进开发并以五条 User Story 逐项勾选验收取图打通相机拍照与相册选图输出一张可上传的图片建议先做压缩OCR 服务接好 Google Cloud Vision 的TEXT_DETECTION请求与错误处理网络失败、配额超限、无文字时应给出友好提示实体解析实现 4 节的正则提取函数并为三条正则编写单元测试仓库中 RegExp-Helper-App 的 Bonus 特性提到可用 Jest 做自动化测试这一做法同样适用于本项目结果展示按类型分组渲染卡片实现点按操作菜单与保存为联系人历史记录本地持久化 列表视图回看可选标签、标签搜索、登录与跨设备同步。值得留意的是OCR 的识别效果高度依赖图片质量建议在测试阶段收集名片、海报、手写便签、屏幕截图等多样化样例用真实数据校准三条正则的边界。同时Google Vision 为付费服务正式发布前务必确认计费方式与用量预估。参考文件索引项目主文档Projects/2-Intermediate/Image-Scaner.md项目总览与 Tier 划分README.md正则校验基础Projects/1-Beginner/Javascript-Validation-With-Regex.md正则调试工具思路Projects/2-Intermediate/RegExp-Helper-App.md项目模板规范Example Guide赞分享文档教程【免费下载链接】app-ideasA Collection of application ideas which can be used to improve your coding skills.项目地址https://gitcode.com/GitHub_Trending/ap/app-ideas点击查看免费下载相关推荐JavaScript 正则表单校验实战密码、用户名与 Gmail 邮箱校验器开发指南app-ideas 入门项目JavaScript 正则表单校验实战密码、用户名与 Gmail 邮箱校验器开发指南app ideas 入门项目 本指南基于开源仓库 app ideas文档教程Book Finder App 实战基于 Google Books API 构建图书搜索应用app-ideas 中级项目开发指南Book Finder App 实战基于 Google Books API 构建图书搜索应用app ideas 中级项目开发指南 本篇指南以 app id文档教程Movie Database App 实战指南基于 MovieDB API 构建电影发现与影评应用app-ideas 高级项目Movie Database App 实战指南基于 MovieDB API 构建电影发现与影评应用app ideas 高级项目 项目文档来源 Proje文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考