从零实现一个证件照制作微信小程序:前端编辑、切换底色、AI 抠图与六寸排版实战
很多证件照工具的介绍只会说“支持 AI 换底色”,但真正开发时,难点远不止调用一个模型:照片规格如何管理?微信小程序如何上传图片?后端如何保护 AppSecret?抠图结果如何避免黑边?大图如何避免把手机内存打满?最后导出的 JPG 和六寸排版是否真的符合尺寸?本文以一套原生微信小程序证件照工具的技术实现为例,小程序端、FastAPI 服务端、测试用例与部署脚本均已开源,代码详见附件。演示地址:https://zhuanlan.zhihu.com/p/2099151005074068585。读者可参照本文先跑通本地版本,再接入云端人像分割服务,最终完成电子照片生成与六寸冲印排版功能。文中的文件路径与接口名称均对应项目实际代码结构。一、本文最终要做出什么完成后,用户可以完成以下流程:选择一寸/二寸/考试规格 ↓ 从相册选图或调用相机 ↓ 拖动、缩放、旋转、调亮度 ↓ 上传到人像分割服务,得到透明 PNG ↓ 在小程序本地切换红/蓝/白/灰背景 ↓ 按规格导出 JPG,或生成六寸冲印排版二、准备开发环境项目使用微信原生 TypeScript + Less,后端使用 Python 3.11/3.12、FastAPI、Pillow、NumPy 和 ONNX Runtime。需要准备:微信开发者工具;Node.js 18 或更高版本;Python 3.11 或 3.12;一个已注册的小程序 AppID;如果要在手机上调用服务,需要一个 HTTPS 域名,并在微信公众平台配置 request 和 uploadFile 合法域名。把项目导入微信开发者工具时,选择仓库根目录D:\WeChatProjects\miniprogram-3(以自己的项目地址为准),项目配置会把miniprogram/作为小程序根目录。前端没有运行时 npm 依赖,根目录只需要安装 TypeScript 和检查脚本:npm install npm run check npm testnpm run check会检查 TypeScript、页面路由、资源引用和 WXML/WXSS 编译;npm test运行前端工具函数回归测试。先让这两个命令通过,再开始改业务代码,后面排错会简单很多。先记住几个关键文件,后面的步骤会反复用到:文件作用miniprogram/app.json页面路由、窗口和底部 TabBarminiprogram/data/specs.ts规格数据、搜索和自定义尺寸miniprogram/pages/editor/editor.ts选图、手势裁剪、抠图和编辑状态miniprogram/utils/cutout-service.ts微信登录、上传、短期令牌和 Base64 解码miniprogram/utils/image-processing.ts裁剪约束、亮度和透明人像合成miniprogram/utils/export-image.tsCanvas 导出 JPG 和临时文件清理miniprogram/utils/print-layout.ts六寸相纸尺寸和照片网格server/app.pyFastAPI 路由、模型初始化、鉴权和资源限制如果想先运行完整代码,可以直接把项目导入开发者工具并编译首页;如果想跟着本文改造,按上表从数据层到页面层逐步修改,不要把所有逻辑都写进一个index.ts。三、先定义规格数据,不要把尺寸散落在页面里证件照工具的第一层业务模型是规格。项目把规格集中放在miniprogram/data/specs.ts,每条规格同时保存物理尺寸、像素尺寸、DPI、分类和搜索关键词:export interface PhotoSpec { id: string name: string category: string widthMm: number heightMm: number widthPx: number heightPx: number dpi: number note: string keywords: string[] popular?: boolean } function spec(