实现抓图

This commit is contained in:
zqm
2026-03-18 13:38:36 +08:00
parent 47733146ac
commit 6e0b5aa056
7 changed files with 522 additions and 81 deletions

View File

@@ -5,6 +5,7 @@ using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows.Forms;
@@ -778,5 +779,100 @@ namespace Test
txtLog.AppendText($"[{timestamp}] {message}" + Environment.NewLine);
txtLog.ScrollToCaret();
}
/// <summary>
/// 10. ONVIF抓图测试
/// </summary>
private void btnTestOnvifSnapshot_Click(object sender, EventArgs e)
{
try
{
LogMessage("正在测试ONVIF抓图...");
var imageStream = GetSnapshot();
if (imageStream != null)
{
// 显示捕获的图像
using (var image = System.Drawing.Image.FromStream(imageStream))
{
// 清理之前的图像
if (LedImage.Image != null)
{
var oldImage = LedImage.Image;
LedImage.Image = null;
oldImage.Dispose();
}
LedImage.Image = (System.Drawing.Image)image.Clone();
LedImage.SizeMode = PictureBoxSizeMode.Zoom;
LogMessage("ONVIF抓图成功");
}
}
else
{
LogMessage("ONVIF抓图失败: 无法获取图像流");
}
}
catch (Exception ex)
{
LogMessage($"ONVIF抓图错误: {ex.Message}");
}
}
/// <summary>
/// 使用ONVIF协议获取快照
/// </summary>
public System.IO.Stream GetSnapshot()
{
var request = (HttpWebRequest)WebRequest.Create("http://192.168.100.10:8899/cgi-bin/snapshot.cgi");
request.Method = "POST";
request.ContentType = "application/json";
request.Timeout = 10000; // 10秒超时
request.ReadWriteTimeout = 10000;
// 添加认证信息
string username = "admin";
string password = "";
string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"));
request.Headers["Authorization"] = $"Basic {credentials}";
// 发送JSON格式的POST数据
string postData = "{\"action\": \"snapshot\"}";
byte[] data = Encoding.UTF8.GetBytes(postData);
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
// 发送请求
var response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
// 检查响应内容类型
string contentType = response.ContentType;
if (contentType.StartsWith("image/"))
{
// 返回图片二进制流
return response.GetResponseStream();
}
else
{
// 读取JSON错误信息
using (var reader = new StreamReader(response.GetResponseStream()))
{
string errorMessage = reader.ReadToEnd();
response.Close();
throw new Exception($"ONVIF抓图失败: {errorMessage}");
}
}
}
else
{
response.Close();
throw new Exception($"ONVIF抓图失败状态码: {response.StatusCode}");
}
}
}
}