【原创】摄像头实时预览工具(手机端、电脑端)

在电脑上需要使用"非本机来源"的图片时(例如实物、纸质文件、屏幕外的场景),现在的流程是:手机拍照 → 用微信/QQ/数据线传输 → 电脑接收 → 再导入使用,步骤多、效率低。

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

图片

图片

图片

1. 项目背景与目标

1.1 现存痛点

在电脑上需要使用"非本机来源"的图片时(例如实物、纸质文件、屏幕外的场景),现在的流程是: ​手机拍照 → 用微信/QQ/数据线传输 → 电脑接收 → 再导入使用​,步骤多、效率低。

1.2 项目目标

  1. ​电脑端本地摄像头实时预览​:直接调用电脑自带/外接 USB 摄像头,实时显示、随时拍照。
  2. ​手机摄像头实时预览​:手机在同一局域网内接入,画面实时回传到电脑上显示,并支持拍照。
  3. ​拍照直传​​:手机拍到的图片无需任何第三方 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),零外部命令、零管理员要求。