界面预览,手机端首次使用需要授权(按操作说明)支持安卓和苹果



1. 项目背景与目标
1.1 现存痛点
在电脑上需要使用"非本机来源"的图片时(例如实物、纸质文件、屏幕外的场景),现在的流程是: 手机拍照 → 用微信/QQ/数据线传输 → 电脑接收 → 再导入使用,步骤多、效率低。
1.2 项目目标
- 电脑端本地摄像头实时预览:直接调用电脑自带/外接 USB 摄像头,实时显示、随时拍照。
- 手机摄像头实时预览:手机在同一局域网内接入,画面实时回传到电脑上显示,并支持拍照。
- 拍照直传:手机拍到的图片无需任何第三方 App/聊天工具,直接落到电脑端程序,供后续业务使用。
1.3 范围
- 电脑端:C# WinForms 桌面程序(本次重点)。
- 手机端:由电脑端内置服务下发的网页,手机浏览器打开即可,无需安装 App(Android / iOS 通用)。
2. 总体架构
2.1 拓扑
<br>┌──────────────────────────── PC(电脑端 WinForms 主程序)────────────────────────────┐
<br>│ │
<br>│ ┌───────────────┐ ┌──────────────────────────────────────────────────┐ │
<br>│ │ 本地摄像头模块 │ │ 内嵌 Web 服务(Kestrel) │ │
<br>│ │ OpenCvSharp │ │ ├─ HTTPS :8443 / → 手机取景网页 │ │
<br>│ │ VideoCapture │ │ │ /ws → WebSocket 帧通道 │ │
<br>│ └──────┬────────┘ │ │ /shot → 单张拍照上传 │ │
<br>│ │ │ └─ HTTP :8080 /cert.cer → 证书下载/引导页 │ │
<br>│ ▼ │ │ │
<br>│ ┌──────────────────────────────────────────────┐ │ │
<br>│ │ 统一预览与取图层 (ImageBus) │ │ │
<br>│ │ Mat → Bitmap → 预览控件 / 保存 / 剪贴板 / 事件 │ │ │
<br>│ └──────────────────────────────────────────────┘ │ │
<br>│ ▲ │
<br>└──────────┼──────────────────────────────────────────────────────────────────────────┘
<br>│ WebSocket(二进制 JPEG 帧) / HTTP POST(单张原图)
<br>│ 局域网 WiFi 同网段
<br>┌──────────┴─────────────────────────────────┐
<br>│ 手机浏览器(扫码打开的网页) │
<br>│ getUserMedia → <video> 本地实时预览 │
<br>│ → canvas 抓帧 → JPEG → WebSocket 推回电脑 │
<br>│ 拍照按钮 → 原图 HTTP POST 上传 │
<br>└────────────────────────────────────────────┘
2.2 角色职责
| 模块 | 职责 |
|---|---|
| 本地摄像头模块 | 枚举/打开电脑摄像头,产出帧,支持拍照 |
| 内嵌 Web 服务 | 下发手机网页、接收 WebSocket 帧、接收拍照上传、下发证书 |
| 统一预览与取图层 | 所有图像统一入口:显示、保存、剪贴板、对外事件 |
| 手机网页 | 调起摄像头、本地预览、抓帧推流、拍照上传 |
| UI 层(AntdUI) | 界面美化、设备选择、按钮、消息提示等 |
3. 技术选型
3.1 电脑端
| 用途 | 选型 | 理由 |
|---|---|---|
| 框架 | .NET 8(SDK 风格,net8.0-windows) | NuGet 原生依赖自动部署;长期维护;AntdUI 提供 net8 版本 |
| UI | WinForms + AntdUI 2.4.12 | 现有已引入,仅用于美化界面与消息提示 |
| 摄像头 | OpenCvSharp4 | 活跃维护;一个库同时覆盖本地摄像头与网络流;后续图像处理不用换库 |
| Web 服务 | ASP.NET Core Kestrel(内嵌自托管) | 免netsh http add sslcert、免管理员权限即可用 HTTPS;原生支持 WebSocket |
| 证书 | **.NETCertificateRequest生成自签名证书**(含局域网 IP 的 SAN) |
不依赖任何第三方工具 |
| 二维码 | QRCoder(MIT,纯托管,无原生依赖) | 本地生成,手机扫码接入,符合"用本地资源"偏好 |
备选:AForge.NET(纯托管、零原生依赖、体积最小,但已停更,仅能采集)。若只想最快出原型可临时改用,长期仍建议 OpenCvSharp4。 备选:EmguCV(能力同 OpenCvSharp,但包体大、商业授权有顾虑),不推荐。
3.2 手机端
- **HTML5
getUserMedia+<video>+<canvas>+WebSocket**:免安装、Android/iOS 通用。 - 备选(后续可加):Android 原生 App(CameraX 直推 MJPEG),无浏览器安全限制,但需 Android 打包环境,iOS 不适用。
3.3 为什么不用 HttpListener + netsh
.NET 的 HttpListener 做 HTTPS 必须先用 netsh http add sslcert 把证书绑到端口,需要管理员权限且易踩坑。改用 Kestrel 可以在代码里直接 UseHttps(pfx, password),零外部命令、零管理员要求。