- bunfig.toml 的 [fmt]:不写分号、单引号、一行最长 160,和原来的写法一致 - .prettierignore:docs/教材摘要/ 是书上的摘录,不格式化 - 模板里一行写两条语句的事件处理(@keydown.delete、@dblclick)改成调用方法:去掉分号后拆成两行,Vue 编译不过 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.5 KiB
3.5 KiB
任务目标
做一个校园监控程序:输入摄像机 IP 点"开",图片框里实时显示摄像机拍到的画面;用四个方向键转动摄像机;点"拍照"把当前画面保存成图片。
练习重点:图片框(PictureBox)、给设备的事件绑定处理方法(+=)、static 变量、文件夹和图片的保存。详细步骤见书 p78–81。
界面和控件名
| 控件 | 名称(Name) | 文字(Text)和用途 |
|---|---|---|
| 窗体 | Form1 |
网络摄像机 |
| 图片框 | pictureBox1 |
显示画面;背景色设为黑色,显示方式选"拉伸填满"(StretchImage) |
| 标签 | label1 |
摄像机IP |
| 文本框 | txt_ip |
输入摄像机的 IP |
| 按钮 | btn_open |
开(打开后变成"关") |
| 按钮 | btn_up |
↑(向上转) |
| 按钮 | btn_down |
↓(向下转) |
| 按钮 | btn_left |
←(向左转) |
| 按钮 | btn_right |
→(向右转) |
| 按钮 | btn_camera |
拍照 |
实现步骤
- 代码开头加上
using System.IO;和using DeviceCtrlLibrary;。 - 声明 4 个全局变量:拍照保存路径
CameraPath(static,程序所在目录下的Camera/文件夹)、摄像机 IPIpCameraIPAddress(static)、bool IsOpen、存当前画面的Image ReadImage。 - 写一个方法
ipCameraHelper_ImageRead(ImageReadEvenArgs e):把e.img存进ReadImage,再显示到pictureBox1。 - Form1_Load:
Camera文件夹不存在就用Directory.CreateDirectory建一个;用+=把第 3 步的方法绑定到DeviceCtrlHelper.ipCameraHelper.ImageRead事件上。 - btn_open 的 Click:先把
IsOpen取反;- 打开时:取
txt_ip里的 IP,调用ipCameraHelper.Open(IP, "admin", "")连接,再Start()开始传画面,按钮文字改成"关"; - 关闭时:
Stop()停止传画面,按钮文字改回"开"。
- 打开时:取
- 四个方向键的 Click:分别调用
ipCameraHelper.PanUp()、PanDown()、PanLeft()、PanRight()。 - btn_camera 的 Click:
ReadImage不是 null 时,用当前时间做文件名,ReadImage.Save(...)存成 .jpg 到CameraPath。
和书上不一样的地方
书上第 6 步只写了
using System.IO.Ports;,可是Directory要用using System.IO;,不加会编译不过。这个任务不用串口,System.IO.Ports可以不写。
在平台上怎么试
- 运行后在 IP 框里填 192.168.2.50(填别的 IP 也能连上),点"开",按钮变成"关",图片框里出现东围墙的画面,实训台顶棚的网络摄像头亮起。
- 点四个方向键,画面应跟着转动:每点一次转一格,左右各 3 格、上下各 1 格,转到头就不再动。
- 点"拍照",运行区下方出现"程序保存的图片",点开能看到刚拍的照片(只在这次运行中保留)。
- 再点"关",按钮变回"开",画面停止更新。